目的
为子系统的一组接口提供统一的接口。Façade定义了使子系统更易于使用的更高级别的接口。
要解决的问题
复杂的软件系统通常被构造(分层)成子系统
复杂子系统的客户端引用并了解(取决于)许多不同的对象(具有不同的接口),这使得客户端与子系统紧密耦合,紧密耦合的对象很难实现,更改,测试和重用。因为它们依赖许多不同的对象
如果我们要最小化对子系统的依赖性,则避免这种方法
复杂的子系统应该提供简化的视图,对于大多数只需要一些基本功能的客户端来说,这已经足够了
要更多底层功能的客户端应该能够直接访问子系统中的对象
解决方案
定义一个单独的Façade对象,为子系统中的一组接口提供统一的接口
通过Façade,最大程度地减少对子系统的依赖性
动机
没有Façade直接访问
客户端和子系统之间的紧密耦合
客户引用并了解(取决于)子系统中的不同接口,这使得客户很难实现,更改,测试和重用
适用性
在以下情况下可以考虑使用外观模式:
(1) 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
(2) 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
(3) 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
结构
(1) Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
(2) SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。
协作
优缺点
外观模式的主要优点如下:
(1) 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
(2) 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
(3) 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
外观模式的主要缺点如下:
(1) 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活 性。
(2) 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。
实施
实施变体:
该Façade接口是根据(通过委托)子系统的适当接口实现的。
尽管子系统对象执行实际的工作,但是外观可能必须自行完成将其接口转换为子系统的接口的工作。
外观可以提供子系统的简单默认视图,足以满足大多数客户的需求,只有需要更多可定制性的客户端才需要在外观后面进行观察。
代码实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75package facade; public interface Facade { public String opreation(); } package facade; public class Facade1 implements Facade{ private Class1 cl1; private Class2 cl2; private Class3 cl3; public Facade1(Class1 cl1,Class2 cl2,Class3 cl3) { // TODO Auto-generated constructor stub this.cl1=cl1; this.cl2=cl2; this.cl3=cl3; } @Override public String opreation() { // TODO Auto-generated method stub return "Facade forwards to ..."+cl1.toString()+" "+cl2.toString()+" "+cl3.toString(); } } package facade; public class Class1 { private String name; public Class1() { name="Class1"; } public String toString() { return name; } } package facade; public class Class2 { private String name; public Class2() { name="Class2"; } public String toString() { return name; } } package facade; public class Class3 { private String name; public Class3() { name="Class3"; } public String toString() { return name; } } package facade; public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Facade facade=new Facade1(new Class1(),new Class2(),new Class3()); System.out.println(facade.opreation()); } }
结果:
最后
以上就是微笑星月最近收集整理的关于软件设计模式-外观模式总结的全部内容,更多相关软件设计模式-外观模式总结内容请搜索靠谱客的其他文章。
发表评论 取消回复