设计模式(十一)——外观模式

外观模式可以理解为为系统增加一个外观类,这个外观类就是类似于网站的主页,相当于用户不用再与网站的子网页交互,而只需要与主页交互,可以理解为一个总的控制中心,用户和子系统的复杂关系由外观角色来实现,从而降低了系统的耦合度。
外观模式组成:外观角色,子系统角色,客户端。

//子系统角色
public class AirCondition {

    public void on(){
        System.out.println("空调打开");
    }
    public void off(){
        System.out.println("空调关闭");
    }
}
public class Fan {

    public void on(){
        System.out.println("风扇打开");
    }
    public void off(){
        System.out.println("风扇关闭");
    }
}
public class Light {

    private String position;
    public Light(String position){
        this.position = position;
    }
    public void on(){
        System.out.println(this.position + "灯打开!");
    }
    public void off(){
        System.out.println(this.position + "灯关闭");
    }
}
public class Television {

    public void on(){
        System.out.println("电视打开");
    }
    public void off(){
        System.out.println("电视关闭");
    }
}
//外观角色类
public class SwitchFacade {

    private Light lights[] = new Light[4];
    private Fan fan; 
    private AirCondition ac;
    private Television tv;

    public SwitchFacade(){
        lights[0] = new Light("左前");
        lights[1] = new Light("右前");
        lights[2] = new Light("左后");
        lights[3] = new Light("右后");
        fan = new Fan();
        ac = new AirCondition();
        tv = new Television();
    }
    public void on(){
        for(int i = 0; i < lights.length; i ++){
            lights[i].on();
        }
        fan.on();
        ac.on();
        tv.on();
    }
    public void off(){
        for(int i = 0; i < lights.length; i ++){
            lights[i].off();
        }
        fan.off();
        ac.off();
        tv.off();
    }
}
//客户端
public class Client {

    public static void main(String[] args){

        SwitchFacade sw = new SwitchFacade();
        sw.on();
    }
}

文件加密

public class Client   
{  
    public static void main(String args[])   
    {  
        EncryptFacade ef=new EncryptFacade();  
        ef.fileEncrypt("444", "555");  
    }  
}  
public class EncryptFacade   
{  
    private FileReader reader;  
    private CipherMachine cipher;  
    private FileWriter writer;  

    public EncryptFacade()  
    {  
        reader=new FileReader();  
        cipher=new CipherMachine();  
        writer=new FileWriter();  
    }  
    public void fileEncrypt(String fileNameSrc,String fileNameDes)  
    {  
        String plainStr=reader.read(fileNameSrc);  
        String encryptStr=cipher.encrypt(plainStr);  
        writer.write(encryptStr, fileNameDes);  
    }  
}  
public class FileReader {
    public String read(String fileNameSrc)  
    {  
        return fileNameSrc;  
    }  
}
public class FileWriter {
    public void write(String encryptText,String fileNameDes)  
    {  
        System.out.println(encryptText);  
        System.out.println(fileNameDes);  
    }
}

外观模式优点:
(1)外观模式并不给系统增加新功能,它仅仅是增加一些简化的接口,对客户端屏蔽子系统组件,减少客户处理的对象数,并使得得子系统使用起来更加容易。通过引入外观模式,客户端的代码将变简单,使其关联的对象也很少。
(2)只是提供一个访问子系统的统一入口,并不影响客户端直接调用子系统。
外观模式适用环境:
(1)客户程序与子程序有很大的依赖性。引入外观类将子程序与客户解耦,提高子程序和客户程序的移植性。

在外观模式中通常只有一个是外观类,并且外观类只有一个实例,换而言之它是一个单例类。但是不是说一个系统只能由一个外观类。

注意:不要通过外观类为子系统增加新行为,这样会使得系统很难读懂。

外观模式最大的缺点是违背了“开闭原则”,当增加新的子系统或者移除子系统时需要修改外观类,可以通过引入抽象外观类在一定程度上解决这个问题,客户端针对抽象外观类来编程,对于新业务只需要增加一个新的具体的外观类即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值