zoukankan      html  css  js  c++  java
  • java外观模式(Facade)

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

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

        如下图:

         

          在如下图:

             

           

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

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

               创建Cpu类:

     1 package design.pattern.facade;
     2 
     3 public class Cpu {
     4     public void turnOn() {
     5         System.out.println("启动CPU");
     6     }
     7 
     8     public void shutdown() {
     9         System.out.println("关闭CPU");
    10     }
    11 }
    View Code

              同理创建Memery类:

     1 package design.pattern.facade;
     2 
     3 public class Memery {
     4     public void turnOn() {
     5         System.out.println("加载内存");
     6     }
     7 
     8     public void shutdown() {
     9         System.out.println("释放内存");
    10     }
    11 }
    View Code

              最后创建Disk类:

     1 package design.pattern.facade;
     2 
     3 public class Disk {
     4    public void turnOn(){
     5        System.out.println("加载硬盘");
     6    }
     7    
     8    public void shutdown(){
     9        System.out.println("关闭硬盘");
    10    }
    11 }
    View Code

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

     1 package design.pattern.facade;
     2 
     3 /*
     4  * Computer就是外观接口类,
     5  * 这里是要使用接口或者抽象类的了,到时用户调用的都是这种类型的,
     6  * 这样就算我们修改了内部,对用户的操作都没有影响
     7  * **/
     8 public abstract class Computer {
     9     public abstract void turnOn();
    10     public abstract void shutdown();
    11 }
    View Code

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

     1 package design.pattern.facade;
     2 
     3 public class DellComputer extends Computer{
     4     //这个是关键,这里声明为private是防止用户直接去调用这些子系统
     5     //保证了用户只能通过外观类来进行访问
     6     
     7     //同时这里也是缺点,当新增子系统是必须手动修改DellComputer
     8     private Cpu cpu;
     9     private Memery mem;
    10     private Disk disk;
    11     
    12     //这个构造方法也很有意思,若没有参数,则自行创建新的子系统,CPU,内存,Disk这些都可以看作子系统
    13     public DellComputer(){
    14         this.cpu = new Cpu();
    15         this.mem = new Memery();
    16         this.disk = new Disk();
    17     }
    18     
    19     public DellComputer(Cpu cpu,Memery mem,Disk disk){
    20         this.cpu = cpu;
    21         this.mem = mem;
    22         this.disk = disk;
    23     }
    24     
    25     //下面这两个方法都一样,都是统一调用了3个子系统的方法
    26     @Override
    27     public void turnOn() {
    28         cpu.turnOn();
    29         mem.turnOn();
    30         disk.turnOn();
    31     }
    32 
    33     @Override
    34     public void shutdown() {
    35         cpu.shutdown();
    36         mem.shutdown();
    37         disk.shutdown();
    38     }
    39 
    40 }
    View Code

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

    1 package design.pattern.facade;
    2 
    3 public class Tommy {
    4     public static void main(String[] args){
    5         Computer com = new DellComputer();
    6         com.turnOn();//开电脑,用户只需要按下开机按钮,CPU,内存,硬盘这些都会自动启动,而不需要用户操心
    7         com.shutdown();//关机,同理,难道还得用户一个个的关么···
    8     }
    9 }
    View Code

          运行结果:

          

    3.小总结:

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

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

           3.2. 优点:

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

           3.3. 缺点:

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

    参考链接:http://www.cnblogs.com/dobetter/archive/2012/05/07/2488148.html 和 http://www.cnblogs.com/voidy/p/4234683.html

  • 相关阅读:
    C++指针(一)
    探讨mvc下linq多表查询使用viewModel的问题
    利用aspnetPager控件加存储过程实现对gridview的分页
    Javascript 笔记
    对于最近学习WCF的总结——唔聊的服务
    今天面试的一些知识性总结
    使用C#反序列化plist文件
    Running x86 apps on WinRT devices
    ItemsSource绑定中遇到的问题
    字节对齐 详解
  • 原文地址:https://www.cnblogs.com/tommy-huang/p/4284206.html
Copyright © 2011-2022 走看看