重温设计模式之外观模式

外观模式 或称门面模式

Facade Pattern 

为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

 万能读卡器是一个外观模式在生活中的应用。便携存储卡有SD卡、CF卡、TF卡等多种类型,想让电脑支持所有的卡类型,需要预设一排各种各样的接口。使用万能读卡器后,只要设置USB接口就可以了。

 如果用代码来描述这一过程,就是标准的外观模式了。

UML图:

代码:

public class CFCard {
    public String readCF() {
        return "从CF卡读取文件";
    }

    public void writeCF(String file) {
        System.out.println("向CF卡写入文件");
    }
}
public class SDCard {

    public String readSD() {
        return "从SD卡读取文件";
    }

    public void writeSD(String file) {
        System.out.println("向SD卡写入文件");
    }
}
public class TFCard {
    public String readTF() {
        return "从TF卡读取文件";
    }

    public void writeTF(String file) {
        System.out.println("向TF卡写入文件");
    }
}

 

public class UnifiedCardReader {

    private SDCard sdCard;
    private CFCard cfCard;
    private TFCard tfCard;
    private int type;

    public String read() {
        switch (type) {
            case 1:
                return sdCard.readSD();
            case 2:
                return cfCard.readCF();
            case 3:
                return tfCard.readTF();
            default:
                return "没有插入卡";
        }
    }

    public void write(String file) {
        switch (type) {
            case 1:
                sdCard.writeSD(file);
                break;
            case 2:
                cfCard.writeCF(file);
                break;
            case 3:
                tfCard.writeTF(file);
                break;
        }
    }

    public void setSdCard(SDCard sdCard) {
        this.sdCard = sdCard;
        this.type = 1;
    }

    public void setCfCard(CFCard cfCard) {
        this.cfCard = cfCard;
        this.type = 2;
    }

    public void setTfCard(TFCard tfCard) {
        this.tfCard = tfCard;
        this.type = 3;
    }

    public void empty() {
        this.sdCard = null;
        this.cfCard = null;
        this.tfCard = null;
        this.type = 0;
    }
}

客户端:

public class Client {

    public static void main(String[] args) {

        UnifiedCardReader unifiedCardReader = new UnifiedCardReader();
        unifiedCardReader.setSdCard(new SDCard());
        unifiedCardReader.write("some files");
        System.out.println(unifiedCardReader.read());

        unifiedCardReader.empty();
        unifiedCardReader.setCfCard(new CFCard());
        unifiedCardReader.write("some files");
        System.out.println(unifiedCardReader.read());
    }
}

《阿里巴巴Java开发手册》中规定,应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架SLF4J中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

log4j、logback等日志框架都有各自的API,如果在代码中直接使用,在需要更换日志系统时需要修改各个应用中的各处代码。如果使用SLF4J,则直接更换日志组件即可,不需要修改代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值