设计模式之–外观模式
简介:
本篇文章是介绍 23 中设计模式中的结构型设计模式中的
外观模式
.使用的是 Java 代码.
目录:
1.什么是外观模式
定义:
外观模式也叫门面模式
是结构型设计模式之一. 是我们常用写用来写一些简单工具类的常用做法. 可能我们用了都不知道.就是通过一个我们自己写的外观类去调用另外一些类的功能实现.然后我外部调用的使用就只要简单的用外观类就可以了.
要求一个子系统的外部与内部的通信必须通过一个统一的对象进行. 此模式提供一个高层的接口, 使得子系统更易于使用.
结构:
- Facde(外观类)
知道哪些子系统类负责处理请求, 将客户端的请求代理给适当的子系统对象.
- Subsystem(子系统类)
可以有一个或多个子系统. 实现子系统的功能, 处理外观类指派的任务, 注意子系统不含有外观类的引用.
2.外观模式的使用场景和优点
使用场景:
-
构建一个有层次结构的子系统时, 使用外观模式定义子系统中每层的入口点, 如果子系统之间是相互依赖的, 则可以让其通过外观接口进行通信, 减少子系统之间的依赖关系.
-
子系统往往会因为不断的重构演化变得越来越复杂, 大多数的模式使用时也会产生很多很小的类, 这给外部调用它们的用户程序带来了使用上的困难. 我们可以使用外观类提供一个简单的接口, 对外隐藏子系统的具体实现.
-
当代码难以拓展和维护, 但新的需求又必须依赖它时, 可以使用外观类为遗留代码加一个简单的接口, 让外部和内部的交互更加简单.
优点:
- 减少系统的相互依赖, 所有依赖都是对外观的依赖, 与子系统无关.
- 对用户隐藏了子系统的具体实现, 减少系统耦合.
- 加强了安全性, 子系统中的方法如果不在外观类中开通, 就无法访问到子系统中的方法.
缺点:
- 不符合开闭原则. 如果新的业务逻辑出现, 可能要直接修改外观类.
3.外观模式的简单运用
子系统类
/**
* cpu子系统类
* @author Administrator
*
*/
public class CPU
{
public static final Logger LOGGER = Logger.getLogger(CPU.class);
public void start()
{
LOGGER.info("cpu is start...");
}
public void shutDown()
{
LOGGER.info("CPU is shutDown...");
}
}
/**
* Disk子系统类
* @author Administrator
*
*/
public class Disk
{
public static final Logger LOGGER = Logger.getLogger(Disk.class);
public void start()
{
LOGGER.info("Disk is start...");
}
public void shutDown()
{
LOGGER.info("Disk is shutDown...");
}
}
/**
* Memory子系统类
* @author Administrator
*
*/
public class Memory
{
public static final Logger LOGGER = Logger.getLogger(Memory.class);
public void start()
{
LOGGER.info("Memory is start...");
}
public void shutDown()
{
LOGGER.info("Memory is shutDown...");
}
}
外观类
/**
* 门面类(核心)
* @author Administrator
*
*/
public class Computer
{
public static final Logger LOGGER = Logger.getLogger(Computer.class);
private CPU cpu;
private Memory memory;
private Disk disk;
public Computer()
{
cpu = new CPU();
memory = new Memory();
disk = new Disk();
}
public void start()
{
LOGGER.info("Computer start begin");
cpu.start();
disk.start();
memory.start();
LOGGER.info("Computer start end");
}
public void shutDown()
{
LOGGER.info("Computer shutDown begin");
cpu.shutDown();
disk.shutDown();
memory.shutDown();
LOGGER.info("Computer shutDown end...");
}
}
客户端调用
/**
* 客户端类
* @author Administrator
*
*/
public class Cilent {
public static final Logger LOGGER = Logger.getLogger(Cilent.class);
public static void main(String[] args)
{
Computer computer = new Computer();
computer.start();
LOGGER.info("=================");
computer.shutDown();
}
}