java 中facade_java外观模式(Facade)

1.外观模式(Facade [fə'sɑd] n. 正面;表面;外观)

外观模式:可以理解为 中介模式(没错,就是在用户与系统之间,增加了一个类,而这个类就是外观类,所以这个模式就叫外观模式)

如下图:

094b2cc2d957bab68ed136169dae02de.png

在如下图:

f6eddbb01f027e6a5da71403d3b6851d.png

2.代码实现,我们就以第二个图为例子

2.1.首先创建三个子系统类

创建Cpu类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 public classCpu {4 public voidturnOn() {5 System.out.println("启动CPU");6 }7

8 public voidshutdown() {9 System.out.println("关闭CPU");10 }11 }

View Code

同理创建Memery类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 public classMemery {4 public voidturnOn() {5 System.out.println("加载内存");6 }7

8 public voidshutdown() {9 System.out.println("释放内存");10 }11 }

View Code

最后创建Disk类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 public classDisk {4 public voidturnOn(){5 System.out.println("加载硬盘");6 }7

8 public voidshutdown(){9 System.out.println("关闭硬盘");10 }11 }

View Code

2.2. 创建外观类,或者叫 中介类 Computer,为了能够使用多态,这里先创建一个Computer的抽象类

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 /*

4 * Computer就是外观接口类,5 * 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的,6 * 这样就算我们修改了内部,对用户的操作都没有影响7 * **/

8 public abstract classComputer {9 public abstract voidturnOn();10 public abstract voidshutdown();11 }

View Code

在创建一个DellComputer继承了Computer类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 public class DellComputer extendsComputer{4 //这个是关键,这里声明为private是防止用户直接去调用这些子系统5 //保证了用户只能通过外观类来进行访问6

7 //同时这里也是缺点,当新增子系统是必须手动修改DellComputer

8 privateCpu cpu;9 privateMemery mem;10 privateDisk disk;11

12 //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统

13 publicDellComputer(){14 this.cpu = newCpu();15 this.mem = newMemery();16 this.disk = newDisk();17 }18

19 publicDellComputer(Cpu cpu,Memery mem,Disk disk){20 this.cpu =cpu;21 this.mem =mem;22 this.disk =disk;23 }24

25 //下面这两个方法都一样,都是统一调用了3个子系统的方法

26 @Override27 public voidturnOn() {28 cpu.turnOn();29 mem.turnOn();30 disk.turnOn();31 }32

33 @Override34 public voidshutdown() {35 cpu.shutdown();36 mem.shutdown();37 disk.shutdown();38 }39

40 }

View Code

2.3.最后,来使用一下,创建一个用户 Tommy类:

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 packagedesign.pattern.facade;2

3 public classTommy {4 public static voidmain(String[] args){5 Computer com = newDellComputer();6 com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心

7 com.shutdown();//关机,同理,难道还得用户一个个的关么···

8 }9 }

View Code

运行结果:

820d7948ca2d222fd4dae4c198479bd7.png

3.小总结:

3.1. 什么时候使用外观模式:

当用户仅关心调用的接口,而不关心内部运作时,可以尝试使用

3.2. 优点:

使用了中介类嘛,稍微解耦了一下,不过也正因为这个中介类,导致了它不可避免的硬伤

3.3. 缺点:

用户调用这边几乎没什么问题,关键是,当子系统类有变动时(新增、删除、或修改方法),中介类(外观类)必须做修改····

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值