1.定义
提供一个统一接口用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
2.最少知识原则
定义:只和你的密友谈话。
遵循最少知识原则使我们尽量减少对象之间的交互,这个原则使我们在设计中,不要让太多类耦合在一起,避免修改系统中的一部分会影响到其他部分的情况。而外观模式则是最少知识原则的最佳实践者。
我们直接来看个图:
3.测试代码
一个形状接口,三个实现类:圆形,方形,三角形,现在client使用外观类来调用所有的形状的实现。
接口类:
/**
* 定义形状接口
*/
public interface Shape {
public void draw();
}
圆形:
/**
* 定义圆形实现类
*/
public class Circle implements Shape {
@Override
public void draw() {
System.out.println(" this is circle shape");
}
}
方形:
/**
* 定义方形实现类
*/
public class Square implements Shape {
@Override
public void draw() {
System.out.println(" this is square shape");
}
}
三角形:
/**
* 定义三角形实现类
*/
public class Triangle implements Shape {
@Override
public void draw() {
System.out.println(" this is triangle shape");
}
}
外观类:
/**
* 定义形状外观类
* 为复杂的各种具体形状类提供统一供外界访问的入口
*/
public class FacadeClass {
private Circle circle;
private Square square;
private Triangle triangle;
public FacadeClass() {
circle = new Circle();
square = new Square();
triangle = new Triangle();
}
public void drawCircle() {
circle.draw();
}
public void drawSquare() {
square.draw();
}
public void drawTriangle() {
triangle.draw();
}
}
测试入口类:
public class InitMain {
public static void main(String[] args) {
/**
* 通过外观类给复杂的子系统提供统一的访问入口,外部通过外观类访问各个子系统
* 外观类降低了外部系统与各个子系统的耦合性
*/
//外观类
FacadeClass facade = new FacadeClass();
//通过访问外观类,实现与Circle子类的解耦
facade.drawCircle();
//通过访问外观类,实现与Square子类的解耦
facade.drawSquare();
//通过访问外观类,实现与Triangle子类的解耦
facade.drawTriangle();
}
}
4.总结
优点:外观将客户从一个复杂的子系统中解耦。减少系统之间的依赖。正在开发的系统或者遗留的一个大型系统时候,如果难以维护担有很重要,就可以使用外观模式提供一个简化接口。
缺点:不符合开闭原则(开放-关闭原则:类应该对扩展开放,对修改关闭),改东西很麻烦。