设计模式——外观模式


名称Facade
结构facade.gif
意图为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性
  • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。F a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过f a c a d e 层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入f a c a d e 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当你需要构建一个层次结构的子系统时,使用f a c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过f a c a d e 进行通讯,从而简化了它们之间的依赖关系。
Code Example
 1 None.gif //  Facade
 2 None.gif
 3 None.gif //  Intent: "Provide a unified interface to a set of interfaces in a subsystem.
 4 None.gif //  Facade defines a higher-level interface that makes the subsystem easier
 5 None.gif //  to use". 
 6 None.gif
 7 None.gif //  For further information, read "Design Patterns", p185, Gamma et al.,
 8 None.gif //  Addison-Wesley, ISBN:0-201-63361-2
 9 None.gif
10 ExpandedBlockStart.gifContractedBlock.gif /**/ /* Notes:
11InBlock.gif * Many subsystems are complex to manage - and this is a dis-incentive for 
12InBlock.gif * client code to use them. A Facasde design pattern provides a simlified 
13InBlock.gif * high-level API to the client, thus shielding it from direct contact 
14InBlock.gif * with the (more complex) subsystem classes.  
15InBlock.gif * 
16InBlock.gif * Often the code that is inside a facade would have to be inside client 
17InBlock.gif * code without the facade. The subsystem code beneath the facade can 
18InBlock.gif * change, without affecting the client code. 
19ExpandedBlockEnd.gif */

20 None.gif 
21 None.gif namespace  Facade_DesignPattern
22 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
23InBlock.gif    using System;
24InBlock.gif
25InBlock.gif    class SubSystem_class1 
26ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
27InBlock.gif        public void OperationX() 
28ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
29InBlock.gif            Console.WriteLine("SubSystem_class1.OperationX called");
30ExpandedSubBlockEnd.gif        }

31ExpandedSubBlockEnd.gif    }

32InBlock.gif
33InBlock.gif    class SubSystem_class2
34ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
35InBlock.gif        public void OperationY()
36ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
37InBlock.gif            Console.WriteLine("SubSystem_class2.OperationY called");
38ExpandedSubBlockEnd.gif        }

39ExpandedSubBlockEnd.gif    }

40InBlock.gif
41InBlock.gif    class SubSystem_class3 
42ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
43InBlock.gif        public void OperationZ()
44ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{            
45InBlock.gif            Console.WriteLine("SubSystem_class3.OperationZ called");
46ExpandedSubBlockEnd.gif        }
    
47ExpandedSubBlockEnd.gif    }

48InBlock.gif
49InBlock.gif    class Facade 
50ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
51InBlock.gif        private SubSystem_class1 c1 = new SubSystem_class1();
52InBlock.gif        private SubSystem_class2 c2 = new SubSystem_class2();
53InBlock.gif        private SubSystem_class3 c3 = new SubSystem_class3();
54InBlock.gif
55InBlock.gif        public void OperationWrapper()
56ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
57InBlock.gif            Console.WriteLine("The Facade OperationWrapper carries out complex decision-making");
58InBlock.gif            Console.WriteLine("which in turn results in calls to the subsystem classes");
59InBlock.gif            c1.OperationX();
60ExpandedSubBlockStart.gifContractedSubBlock.gif            if (1==1 /**//*some really complex decision*/)
61ExpandedSubBlockStart.gifContractedSubBlock.gif            dot.gif{
62InBlock.gif                c2.OperationY();
63ExpandedSubBlockEnd.gif            }

64InBlock.gif            // lots of complex code here . . .
65InBlock.gif            c3.OperationZ();
66ExpandedSubBlockEnd.gif        }

67InBlock.gif        
68ExpandedSubBlockEnd.gif    }

69InBlock.gif
70ExpandedSubBlockStart.gifContractedSubBlock.gif    /**//// <summary>
71InBlock.gif    ///    Summary description for Client.
72ExpandedSubBlockEnd.gif    /// </summary>

73InBlock.gif    public class Client
74ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
75InBlock.gif          public static int Main(string[] args)
76ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
77InBlock.gif            Facade facade = new Facade();
78InBlock.gif            Console.WriteLine("Client calls the Facade OperationWrapper");
79InBlock.gif            facade.OperationWrapper();      
80InBlock.gif            return 0;
81ExpandedSubBlockEnd.gif        }

82ExpandedSubBlockEnd.gif    }

83ExpandedBlockEnd.gif}

84 None.gif
85 None.gif

转载于:https://www.cnblogs.com/DarkAngel/archive/2005/06/30/183725.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值