写信的过程大家应该都还记得
——先写信的内容,然后写信封,再把信放到信封中,封好,投递到信箱中进行邮递,这个
过程还是比较简单的,虽然简单,但是这4个步骤都不可或缺!我们先把这个过程通过程序
实现出来,如图
package FacadeP; public interface ILetterProcess { //首先要写信的内容 public void writeContext(String context); //其次写信封 public void fillEnvelope(String address); //把信放到信封里 public void letterInotoEnvelope(); //然后邮递 public void sendLetter(); }
package FacadeP; public class LetterProcessImpl implements ILetterProcess { @Override public void writeContext(String context) { System.out.println("填写信的内容..." + context); } @Override public void fillEnvelope(String address) { System.out.println("填写收件人地址及姓名..." + address); } @Override public void letterInotoEnvelope() { System.out.println("把信放到信封中..."); } @Override public void sendLetter() { System.out.println("邮递信件..."); } }
package FacadeP; public class Client { public static void main(String[] args) { ILetterProcess letterProcess = new LetterProcessImpl(); letterProcess.writeContext("666"); letterProcess.fillEnvelope("8888"); letterProcess.letterInotoEnvelope(); letterProcess.sendLetter(); } }
我们回过头来看看这个过程,它与高内聚的要求相差甚远,更不要说迪米特法则、接口
隔离原则了。你想想,你要知道这4个步骤,而且还要知道它们的顺序,一旦出错,信就不
可能邮寄出去,这在面向对象的编程中是极度地不适合,它根本就没有完成一个类所具有的
单一职责。
还有,如果信件多了就非常麻烦,每封信都要这样运转一遍,非得累死,更别说要发个
广告信了,那怎么办呢?还好,现在邮局开发了一个新业务,你只要把信件的必要信息告诉
我,我给你发,我来完成这4个过程,只要把信件交给我就成了,其他就不要管了。非常好
的方案!我们来看类图
package FacadeP; public class ModenPostOffice { private ILetterProcess letterProcess = new LetterProcessImpl(); public void sendLetter(String content,String address){ letterProcess.writeContext(content); letterProcess.fillEnvelope(address); letterProcess.letterInotoEnvelope(); letterProcess.sendLetter(); } }
package FacadeP; public class Client1 { public static void main(String[] args) { ModenPostOffice modenPostOffice = new ModenPostOffice(); String adderss = "oo"; String context = "sss"; modenPostOffice.sendLetter("context","address"); } }
运行结果是相同的。我们看看场景类是不是简化了很多,只要与ModenPostOffice交互就
成了,其他的什么都不用管,写信封啦、写地址啦……都不用关心,只要把需要的信息提交
过去就成了,邮局保证会按照我们指定的地址把指定的内容发送出去,这种方式不仅简单,
而且扩展性还非常好,比如一个非常时期,寄往God Province(上帝省)的邮件都必须进行
安全检查,那我们就很好处理了,如图
package FacadeP; public class Police { public void checkLetter(ILetterProcess letterProcess){ System.out.println(letterProcess+" 信件已经检查过了..."); } }