外观模式(门面模式)

写信的过程大家应该都还记得
——先写信的内容,然后写信封,再把信放到信封中,封好,投递到信箱中进行邮递,这个
过程还是比较简单的,虽然简单,但是这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+" 信件已经检查过了...");
    }
}

猜你喜欢

转载自blog.csdn.net/zy1104560031/article/details/83546975