喵星之旅-沉睡的猫咪-门面模式

门面模式是什么?

当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

门面模式又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型模式。可以理解为接口的封装。

 

门面模式有哪些应用?

项目开发中不同分层。对于一个功能,如果是后台系统提供的支持,那么它可能用到了很多数据源、业务,但是对外只提供一个访问接口就可以实现功能,把内部的细节都封装到了一起,就是门面模式。

任何的对外api接口基本都是门面模式,因为极少的api接口内部是十分简单的,一般都会涉及很多的模块、功能。

例如有一张保单的投保,其实也是门面的,我们只是和一家保险公司签订合同,但是实际上,绝大部分的保单都要涉及几家、十几家、甚至几十家保险公司,只是投保人不知道具体的情况,而且出现赔款时,只需要找签订合同的那一家就可以了。将几十家保险公司共同的担保封装成了一个公司的业务,就是门面的思想。

 

代码示例

门面类

package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class Computer { private Cpu cpu; private Disk disk; private Memory memory; public void startup() { cpu.start(); memory.start(); disk.start(); System.out.println("计算机已经启动。"); } public Computer(Cpu cpu, Disk disk, Memory memory) { super(); this.cpu = cpu; this.disk = disk; this.memory = memory; } public Cpu getCpu() { return cpu; } public void setCpu(Cpu cpu) { this.cpu = cpu; } public Disk getDisk() { return disk; } public void setDisk(Disk disk) { this.disk = disk; } public Memory getMemory() { return memory; } public void setMemory(Memory memory) { this.memory = memory; } @Override public String toString() { return "Computer [cpu=" + cpu + ", disk=" + disk + ", memory=" + memory + "]"; } }

 

子系统1

package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Cpu { void start(); }
package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyCpu implements Cpu {

    @Override
    public void start() {
        System.out.println("cpu已经启动。");
    }
     
}

 

子系统2

package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Disk {
    void start();
}
package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyDisk implements Disk {

    @Override
    public void start() {
        System.out.println("硬盘已经启动。");
    }
    
}

 

子系统3

package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Memory {
    void start();
}
package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MyMemory implements Memory {

    @Override
    public void start() {
        System.out.println("内存已经启动。");
    }
    
}

 

测试类

package structure.facade;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class Test {

    public static void main(String[] args) {
        Computer c = new Computer(new MyCpu(), new MyDisk(), new MyMemory());
        c.startup();

    }

}

 


门面模式的特点

简化了调用过程,无需深入了解子系统,以防给子系统带来风险。对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

更好地划分访问层次,提高了安全性。降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。

遵循迪米特法则。

 

ps:项目地址  svn://47.105.188.20/kitty/2%E3%80%81code/pattern    用户名密码:reader/reader

posted @ 2020-03-06 12:29  喵星兔  阅读(171)  评论(0编辑  收藏  举报