其他分享
首页 > 其他分享> > 设计模式 - 外观模式

设计模式 - 外观模式

作者:互联网

目录

实例

手机一键备份功能

假设一个智能手机一键备份数据的应用场景,该功能可以将手机中的通讯录,短信,照片,歌曲等资料一次性备份,在实现过程中需要与多个已有的子系统进行交互,如通讯录子系统、短信子系统等

乍一看该应用场景,如果再添一句需充分考虑系统的灵活性和可扩展性那就与工厂方法模式很类似了,但这里不考虑应用的扩展,只考虑应用的交互


常规的解决方案

/**
 * @Description 通讯录子系统
 */
public class AddressBookService {

    public void backUp() {
        System.out.println("通讯录备份成功");
    }

}
/**
 * @Description 本地音乐子系统
 */
public class LocalMusicService {

    public void backUp() {
        System.out.println("本地音乐备份成功");
    }

}
/**
 * @Description 照片子系统
 */
public class PhotographService {

    public void backUp() {
        System.out.println("照片备份成功");
    }

}
/**
 * @Description 短信子系统
 */
public class ShortMsgService {

    public void backUp() {
        System.out.println("短信备份成功");
    }

}
/**
 * @Description 客户端
 */
public class Client {
    public static void main(String[] args) {

        AddressBookService addressBookService = new AddressBookService();
        LocalMusicService localMusicService = new LocalMusicService();
        PhotographService photographService = new PhotographService();
        ShortMsgService shortMsgService = new ShortMsgService();

        addressBookService.backUp();
        localMusicService.backUp();
        photographService.backUp();
        shortMsgService.backUp();
    }
}
通讯录备份成功
本地音乐备份成功
照片备份成功
短信备份成功

在这里插入图片描述


外观模式

概念


外观模式解决方案

/**
 * @Description 备份外观类
 */
public class BackUpFacade {

    private AddressBookService addressBookService;
    private LocalMusicService localMusicService;
    private PhotographService photographService;
    private ShortMsgService shortMsgService;

    public BackUpFacade() {
        addressBookService = new AddressBookService();
        localMusicService = new LocalMusicService();
        photographService = new PhotographService();
        shortMsgService = new ShortMsgService();
    }

    /**
     * 统一备份
     */
    public void unifiedBackUp() {
        addressBookService.backUp();
        localMusicService.backUp();
        photographService.backUp();
        shortMsgService.backUp();
    }

}
/**
 * @Description 外观模式测试类
 */
public class Test {
    public static void main(String[] args) {
        BackUpFacade backUpFacade = new BackUpFacade();
        backUpFacade.unifiedBackUp();
    }
}
通讯录备份成功
本地音乐备份成功
照片备份成功
短信备份成功

在这里插入图片描述


方案的演进(配置文件)

facadePattern.classNames=AddressBookManager,LocalMusicManager,PhotographManager,ShortMsgManager
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import java.util.stream.Collectors;

/**
 * @Description Properties工具类
 */
public class PropertiesUtil {

    /**
     * 根据key读取value
     * @Description: 相对路径, properties文件需在classpath目录下,
     *               比如:config.properties在包com.coisini.util,
     *               路径就是/com/coisini/util/config.properties
     * @param filePath
     * @param keyWord
     * @return String
     * @throws
     */
     private static String getProperties(String filePath, String keyWord){
        Properties prop = new Properties();
        String value = null;
        try {
            InputStream inputStream = PropertiesUtil.class.getResourceAsStream(filePath);
            prop.load(inputStream);
            value = prop.getProperty(keyWord);
        } catch (IOException e) {
            e.printStackTrace();
        }

        return value;
     }

    /**
     * 根据配置文件提取类名返回实例对象集合
     * @param filePath
     * @param keyWord
     * @param packagePath
     * @return
     */
    private static List<Object> getBeans(String filePath, String keyWord, String packagePath) {
        String[] classNames = getProperties(filePath, keyWord).split(",");
        return Arrays.stream(classNames).map(className -> {
            try {
                return Class.forName(packagePath + className).newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }).filter(Objects::nonNull).collect(Collectors.toList());
    }

    /**
     * 获取外观模式实例对象
     * @return
     */
    public static List<Object> getFacadePatternBeans() {
        return getBeans("/com/coisini/design/util/config.properties",
                "facadePattern.classNames",
                "com.coisini.design.pattern.structural.facade.own.v2.");
    }

}
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Description 备份外观类
 */
public class BackUpFacade {

    private List<AbstractService> abstractServiceList;

    public BackUpFacade() {
        abstractServiceList = PropertiesUtil.getFacadePatternBeans()
                                            .stream()
                                            .map(bean -> (AbstractService) bean)
                                            .collect(Collectors.toList());
    }

    /**
     * 统一备份
     */
    public void unifiedBackUp() {
        this.abstractServiceList.forEach(AbstractService::backUp);
    }

}
/**
 * @Description 外观模式测试类(配置文件反射实现方式)
 */
public class Test {
    public static void main(String[] args) {
        BackUpFacade backUpFacade = new BackUpFacade();
        backUpFacade.unifiedBackUp();
    }
}
通讯录备份成功
本地音乐备份成功
照片备份成功
短信备份成功

总结

1.简化调用过程,无需深入了解子系统,防止带来风险
2.减少系统依赖,松散耦合
3.更好的划分访问层次
4.符合迪米特法则,即最少知道原则
1.增加子系统,扩展子系统行为容易引入风险
2.不符合开闭原则
1.要为访问一系列复杂的子系统提供一个简单入口时
2.客户端程序与多个子系统之间存在很大的依赖性
3.构建多层系统架构,利用外观对象作为每层的入口,简化层间调用
JdbcUtils(SpringJdbc)、Configuration(mybatis)、RequestFacade(Tomcat)

源码


- End -
- 个人学习笔记 -
- 仅供参考 -

标签:外观,java,备份,模式,public,设计模式,backUp,子系统
来源: https://www.cnblogs.com/maggieq8324/p/16080077.html