喵星之旅-沉睡的猫咪-门面模式
门面模式是什么?
当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。
门面模式又叫外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用,属于结构型模式。可以理解为接口的封装。
门面模式有哪些应用?
项目开发中不同分层。对于一个功能,如果是后台系统提供的支持,那么它可能用到了很多数据源、业务,但是对外只提供一个访问接口就可以实现功能,把内部的细节都封装到了一起,就是门面模式。
任何的对外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
作者:喵星兔
出处:https://www.cnblogs.com/kittybunny/
喵星之旅:https://www.cnblogs.com/kittybunny/p/12148641.html
我的视频:https://space.bilibili.com/518581788
更多内容:不咬人的小兔子
本博客所有文章仅用于学习、研究和交流目的,欢迎非商业性质转载。
我是兔子,我会喵,我叫喵星兔~~