Java设计模式之外观模式

模式定义
外观模式(也成为门面模式)要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。它提供一个高层次的接口,使得子系统更易于使用。

使用场景
1.在设计初期阶段,将不同的两个层分离

2.在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。

3.在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须依赖于它。

Java设计模式之外观模式_第1张图片
Client:客户端
Sybsystem:子系统
Facade:对外的(Client)统一入口,即外观对象。

任何Client都可以通过Facade模式,调用Subsystem里面的任何方法。

电视遥控器是现实生活中一个比较好的外观模式的运用,遥控器可以控制电源的开源、声音的调整、频道的切换等。这个遥控器就是我们这里说的外观或者门面,而电源、声音、频道切换系统就是我们的子系统。遥控器统一对这些子模块的控制,我想你没有用过多个遥控器来分别控制电源开关、声音控制等功能。下面演示此案例。

示例

/** * 电源控制系统 */
 class PowerSystem {
    public void powerOn() {
        System.out.println("开机");
    }

    public void powerOff() {
        System.out.println("关机");
    }
}

/** * 声音控制系统 */
class VoiceSystem {
    public void turnUp() {
        System.out.println("音量增大");
    }

    public void turnDown() {
        System.out.println("音量减小");
    }
}

/** * 频道控制系统 */
class ChannelSystem {
    public void next() {
        System.out.println("下一频道");
    }

    public void prev() {
        System.out.println("上一频道");
    }
}
/** * 遥控器 */
public class TvController {
    private PowerSystem mPowerSystem = new PowerSystem();
    private VoiceSystem mVoiceSystem = new VoiceSystem();
    private ChannelSystem mChannelSystem = new ChannelSystem();

    public void powerOn() {
        mPowerSystem.powerOn();
    }

    public void powerOff() {
        mPowerSystem.powerOff();
    }

    public void turnUp() {
        mVoiceSystem.turnUp();
    }

    public void turnDown() {
        mVoiceSystem.turnDown();
    }

    public void nextChannel() {
        mChannelSystem.next();
    }

    public void prevChannel() {
        mChannelSystem.prev();
    }
}

//测试
public static void main(String[] args) {
        TvController controller=new TvController();
        controller.powerOn();
        controller.turnDown();
        controller.nextChannel();
        controller.powerOff();
    }

结果如下:

优点
1.使用方便,使用外观模式客户端完全不需要知道子系统的实现过程
2.降低客户端与子系统的耦合
3.更好的划分访问层次

缺点
1.减少了可变性和灵活性
2.在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”

参考:
Android 设计模式源码解析

你可能感兴趣的:(java,java设计模式,外观模式)