外观模式
意图:
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一系统更加容易使用。
适用性:
1、在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观。
2、在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用他们的用户程序带来了使用上的困难,用外观模式提供一个简单的接口,减少他们之间的依赖。
3、在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与外观对象交互,外观对象与遗留代码交互所有复杂的工作。
UML:
代码实现:
一家餐厅,如果没有服务员,那么饮料、餐具、纸巾什么的都得顾客自己去拿。
交互如图:
有了服务员,则顾客有什么事可以直接找服务员,这就是外观模式的体现。
交互如图:
代码:
1 #include <iostream> 2 using namespace std; 3 4 class Gettableware{ 5 public: 6 Gettableware(){} 7 void doIt() 8 { 9 cout<<"拿餐具!"<<endl; 10 } 11 }; 12 13 class GetDrink{ 14 public: 15 GetDrink(){} 16 void doIt() 17 { 18 cout<<"拿饮料!"<<endl; 19 } 20 }; 21 22 class GetTissue{ 23 public: 24 GetTissue(){} 25 void doIt() 26 { 27 cout<<"拿纸巾!"<<endl; 28 } 29 }; 30 31 class Waiter{ 32 public: 33 Waiter() 34 { 35 mpGettableware = new Gettableware; 36 mpGetDrink = new GetDrink; 37 mpGetTissue = new GetTissue; 38 } 39 40 ~Waiter() 41 { 42 delete mpGetTissue; 43 delete mpGettableware; 44 delete mpGetDrink; 45 } 46 void mGettableware() 47 { 48 mpGettableware->doIt(); 49 } 50 void mGetDrink() 51 { 52 mpGetDrink->doIt(); 53 } 54 void mGetTissue() 55 { 56 mpGetTissue->doIt(); 57 } 58 public: 59 Gettableware* mpGettableware; 60 GetDrink* mpGetDrink; 61 GetTissue* mpGetTissue; 62 }; 63 64 class Client{ 65 public: 66 Client() 67 { 68 mWaiter = new Waiter; 69 } 70 ~Client() 71 { 72 delete mWaiter; 73 } 74 Waiter* mWaiter; 75 }; 76 77 void main() 78 { 79 Client client; 80 client.mWaiter->mGettableware(); 81 client.mWaiter->mGetDrink(); 82 client.mWaiter->mGetTissue(); 83 return; 84 }
时间: 2024-11-02 16:17:22