程序员该如何管理后宫:和女生沟通的艺术(装饰模式)

193 阅读7分钟
原文链接: www.mdjs.info

0x00 前言

朕身居高位,才知,高处不胜寒,不是所有事都可以随心所欲的,身不由己的事情甚多。

比如这次,各地大臣、各位王爷、各个藩国,为了尽臣子之心而讨朕龙颜之悦,搜尽天下之美人儿上京进贡。

朕不怪这些臣子,他们有此心意,朕心甚慰。因朕自即位以来,爱民如子,操劳国事,又不荒淫无度,目前后宫除了皇后也没啥人了。比起历史上的各位皇上的确是寒碜了不少。这不,各位大臣一定要让朕多用些宫女,盛情难却啊。

这事说起来也是好事,而且是朕也不能让大臣们都寒了心了,最关键的一点,各地藩国的美人儿都送到家门口了,你能不收吗,如果不收,下面的藩国还不乱了套,搞不好以为朕闲来无事要灭了他们呢。

这事说起来是简单,但是怎么告诉皇后是个麻烦。直接告诉她:“朕要收下大臣进贡的500个侍女,其中江南美女200个,国内其余各地美人儿,异域美女100个”,这样子立马就坏事了,天都要被捅108个窟窿。所以说嘛,沟通要有技巧,朕自有朕的高招。朕下面就用装饰模式来讲一下和女生沟通的艺术。

0x01 直白型汇报

这个向皇后汇报工作呢,首先要确定的一点,朕肯定不会傻傻地直接告诉她朕要收几百个宫女。怎么也要委婉一点,至少要转移重点。咱们先看类图。

其中Report是个汇报的抽象类,没什么具体内容。ReportHireMaid类是我们要汇报的内容,此处没加任何包装。在SugarReportHireMaid类中我们增加了一些说话技巧,让皇后娘娘听起来开心一点。

下面具体的讲一下。

1. 代码清单 ReportHireMaid类

这是我要表达的直接内容,但是这样是很危险的啊,你想啊,如果这样直接告诉你媳妇,你不被打死我佩服你。我们下面改进

public class ReportHireMaid extends Report{
@Override
public void report() {
System.out.println("朕要收下大臣进贡的500个侍女,其中江南美女200个,国内其余各地美人儿,异域美女100个");
}
}

2. 代码清单 SugarReportHireMaid类

沟通的艺术就在于你如何把一件事以其最优雅的姿态展示出来。在我们这件事上,肯定不能那样僵硬的说出来啊,我们要有策略,我先说几个我认为挺重要的点:

  1. 甩锅。我们要将锅甩给大臣啊。怎么做呢,我们要这样说:我不想要,大臣一定要塞过来,不要的话大臣会伤心,以为朕要做掉他们。
  2. 合理的理由。这个怎么讲,我们要给收下这批侍女找一个合适的理由。在这点上,我们可以说找她们是来好好干活的。
  3. 消除戒心。就说那群妹子们长得丑!你想啊,为什么不让你招这么多侍女,为了不让你沾花惹草啊,但是招进来一群丑八怪呢,这不就放心了嘛。好,就这样干了。

下面就是怎么干了。为了保留最初的汇报类,我们写个子类继承一下。

public class SugarReportHireMaid extends ReportHireMaid {
private void reportCompare() {
System.out.println("皇后大人,你看啊,大臣们总共进贡了1万名宫女,朕如果一个不收实在是寒了众爱卿的心啊!");
}

private void reportSugar() {
System.out.println("朕收下这批侍女只是为了给宫中多加点劳动力,怕平日的工作累到皇后了。朕只爱皇后一个~");
}

private void reportMaidNotBeautiful() {
System.out.println("朕最后挑选的这批侍女,长相都一般般,你想啊,进来干活的,要漂亮的有什么用!");
}

public void report() {
reportCompare();
reportSugar();
reportMaidNotBeautiful();
super.report();
}
}

3. 代码清单 Emperor类

public class Emperor {

public static void main(String[] args) {
Report report = new SugarReportHireMaid();
report.report();
}
}

执行结果。这下子没事了吧,不会被皇后弄死了。

皇后大人,你看啊,大臣们总共进贡了1万名宫女,朕如果一个不收实在是寒了众爱卿的心啊!
朕收下这批侍女只是为了给宫中多加点劳动力,怕平日的工作累到皇后了。朕只爱皇后一个~
朕最后挑选的这批侍女,长相都一般般,你想啊,进来干活的,要漂亮的有什么用!
朕要收下大臣进贡的500个侍女,其中江南美女200个,国内其余各地美人儿,异域美女100个

但是问题来了:现在我们只有三个比较好的理由和说辞,如果理由比较多呢,有30个怎么办,在一个子类里面写30个理由毕竟不太好,因为我们可能要来回组合这些不同的理由来应对不同的场景。

那我们就继续继承呗,这是个不错的方案,但是毕竟不太灵活,而且如果如果真来个30层的继承,那不就蒙圈了。所以下面冒出来了装饰模式

0x02 装饰型汇报

装饰模式可以比较优雅地解决上面的问题。我们先上个类图看一下。

我们加了一个Decorator抽象类,它是为了封装Report类,其实这和代理模式很相近,装饰类也可以理解是一个特殊的代理类。真实的执行者还是被代理的角色ReportHireMaid。

下面具体看一下每个类。Report和ReportHireMaid是不变的,然后把SugarReportHireMaid删除了,由我们的装饰类来代替它的功能。

1. 代码清单 Decorator抽象类

Decorator抽象类是对Report做了一层封装。

看到没,装饰类还是把动作的执行委托给需要装饰的对象,Decorator抽象类的目的很简单,就是要让子类来封装Report的子类,怎么封装?重写report方法!

public abstract class Decorator extends Report{
private Report rt;

public Decorator(Report rt) {
this.rt = rt;
}

public void report() {
this.rt.report();
}
}

2. 代码清单 DecoratorCompare类

这是我们的具体的装饰内容。其它的装饰类也比较类似,我们只列出来一个。

DecoratorCompare类重写了report方法,先调用具体装饰类的装饰方法reportCompare,然后再调用具体构件的方法,

public class DecoratorCompare extends Decorator{

public DecoratorCompare(Report rt) {
super(rt);
}

private void reportCompare() {
System.out.println("皇后大人,你看啊,大臣们总共进贡了1万名宫女,朕如果一个不收实在是寒了众爱卿的心啊!");
}

public void report() {
this.reportCompare();
super.report();
}
}

3. 代码清单 Emperor类

现在看一下Emperor类,是不是和之前很不一样了,我们想对表达做什么装饰,就加一层装饰类就行了,而且顺序很灵活。

public class Emperor {

public static void main(String[] args) {
Report rt = new ReportHireMaid();
rt = new DecoratorSugar(rt);
rt = new DecoratorCompare(rt);
rt = new DecoratorNotBeautiful(rt);
rt.report();
}
}

我们看一下运行结果:

皇后大人,你看啊,大臣们总共进贡了1万名宫女,朕如果一个不收实在是寒了众爱卿的心啊!
朕收下这批侍女只是为了给宫中多加点劳动力,怕平日的工作累到皇后了。朕只爱皇后一个~
朕最后挑选的这批侍女,长相都一般般,你想啊,进来干活的,要漂亮的有什么用!
朕要收下大臣进贡的500个侍女,其中江南美女200个,国内其余各地美人儿,异域美女100个

0xFF 参考

木东居士 wechat 欢迎关注我的微信公众号! 坚持原创技术分享,您的支持将鼓励我继续创作! 打赏 木东居士 微信支付

微信支付