由来:外观模式的由来,举一个例子:研发人员做了一个系统给客户用户使用,客户用户不需要知道那么多的具体细节,客户用户访问这些,具体的细节,耦合度也比较高,所以就定义了 一个外观对象,外观对象去处理这些具体的细节,客户用户只需要去访问外观对象,的行为即可
外观模式在设计中非常的常见,这种模式可以减低耦合度,区域划分的比较灵活,不需要增加客户用户的复杂度;
我们来看几个案例来说明分析:
常规的写法:
/**
* 创建一个煮菜的类
* @author Liudeli
*/
public class Cook {
/**
* 此方法是煮菜的行为
*/
public void doMethod() {
System.out.println("煮好了一条鱼,煮熟了一只鸡,烤完了一头猪....");
}
}
/**
* 定义一个买菜类
* @author Liudeli
*/
public class Food {
/**
* 此方法是买菜的行为
*/
public void doMethod() {
System.out.println("买了一条鱼,买了一只鸡,买了一头猪....");
}
}
/**
* 创建一个洗菜的类
* @author Liudeli
*/
public class Wash {
/**
* 此方法是洗菜的行为
*/
public void doMethod() {
System.out.println("洗好了一条鱼,洗干净一只鸡,洗完了一头猪....");
}
}
/**
* 测试程序
* @author Liudeli
*
*/
public class Main {
public static void main(String[] args) {
Food food = new Food();
food.doMethod();
Wash wash = new Wash();
wash.doMethod();
Cook cook = new Cook();
cook.doMethod();
}
}
执行结果:
修改成外观模式:
/**
* 定义一个买菜类
* @author Liudeli
*/
public class Food {
/**
* 此方法是买菜的行为
*/
public void doMethod() {
System.out.println("买了一条鱼,买了一只鸡,买了一头猪....");
}
}
/**
* 创建一个洗菜的类
* @author Liudeli
*/
public class Wash {
/**
* 此方法是洗菜的行为
*/
public void doMethod() {
System.out.println("洗好了一条鱼,洗干净一只鸡,洗完了一头猪....");
}
}
/**
* 创建一个煮菜的类
* @author Liudeli
*/
public class Cook {
/**
* 此方法是煮菜的行为
*/
public void doMethod() {
System.out.println("煮好了一条鱼,煮熟了一只鸡,烤完了一头猪....");
}
}
/**
* 定义一个外观类
* @author Liudeli
*/
public class Appearance {
/**
* 外观类的执行方法,用于执行具体细节操作,给客户呈现的就是此方法
*/
public void doMethod() {
Food food = new Food();
food.doMethod();
Wash wash = new Wash();
wash.doMethod();
Cook cook = new Cook();
cook.doMethod();
}
}
/**
* 用户客户调用外观类即可,其他具体细节不需要关系
* @author Liudeli
*
*/
public class Main {
public static void main(String[] args) {
// 创建外观对象,执行方法
Appearance appearance = new Appearance();
appearance.doMethod();
}
}
运行结果:
/**
* 定义一个ClassA类
* @author Liudeli
*/
public class ClassA {
/**
* 此方法就是简单的打印一句话
*/
public void methodA() {
System.out.println("ClassA methodA()...");
}
}
/**
* 定义一个ClassB类
* @author Liudeli
*/
public class ClassB {
/**
* 此方法就是简单的打印一句话
*/
public void methodB() {
System.out.println("ClassB methodB()...");
}
}
/**
* 定义一个ClassC类
* @author Liudeli
*/
public class ClassC {
/**
* 此方法就是简单的打印一句话
*/
public void methodC() {
System.out.println("ClassC methodC()...");
}
}
/**
* 定义一个外观类,将ClassA,ClassB,ClassC,统一调用
* @author Liudeli
*/
public class Appearance {
/**
* 此方法用于调用ClassA,ClassB,ClassC类里面的方法
*/
public void method() {
ClassA classA = new ClassA();
classA.methodA();
ClassB classB = new ClassB();
classB.methodB();
ClassC classC = new ClassC();
classC.methodC();
}
}
/**
* 模拟客户端测试程序
* @author Liudeli
*/
public class Main {
public static void main(String[] args) {
// 其他的具体细节,客户不需要知道,因为都交给了外观类
// 调用外观类即可
Appearance appearance = new Appearance();
appearance.method();
}
}
运行结果:
我们会发现外观模式与代理模式是多么的相似,其实认真去分析确实很相似,只是他们的应用场景不一样
谢谢大家的观看,更多精彩技术博客,会不断的更新,请大家访问,
刘德利CSDN博客, http://blog.csdn.net/u011967006
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步