订阅专栏
一、概念
①、什么是外观模式
为子系统的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
这个外观类为子系统提供一个共同的对外接口,客户对象通过一个外观接口读写子系统中各接口的数据资源
②、什么情况下使用外观模式
1.设计初期阶段,有意识的将不同层分离,层与层之间建立外观模式
2.开发阶段,子系统越来越复杂,增加外观模式提供一个简单的接口
3.维护一个大型遗留系统的时候,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互
③、解决了什么问题?
1.实现了子系统与客户端之间的松耦合关系
2.客户端屏蔽了系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易
二、图
外观模式类图
Facade:知道哪些子系统类负责处理请求,将客户的请求代理给适当的子系统对象。外观类,他需要了解所有的字写哦那个的方法或属性,进行组合,以备外界调用
SubSystem Classes 子系统类集合实现子系统的功能,处理Facade对象指派的任务。注意子类中没有Facade的任何信息,既没有对Facade对象的引用。
三、代码
实例:
客户端代码
class Program
{
static void Main(string[] args)//此时用户不需要了解股票,甚至可以对股票一无所知,买了之后,一段时间后再赎回。参与股票的具体买卖都有基金公司完成。客户端代码非常简洁
{
Fund jijin = new Fund(); //用Fund类实例化一个jijin对象,其实是调取了Fund类中的构造函数,实例化了所有基金类控制下的股票,国债,房地产
//基金购买
jijin.BuyFund(); //调取jijin对象的BuyFund()方法,其实是调取了jijin对象中所有子系统的Buy方法
//基金赎回 jijin.SellFund(); //调取jijin对象的SellFund()方法 Console.Read(); } } class Stock1 { //卖股票 public void Sell() { Console.WriteLine("股票1卖出"); } //买股票 public void Buy() { Console.WriteLine("股票1买入"); } } class Stock2 { //卖股票 public void Sell() { Console.WriteLine("股票2卖出"); } //买股票 public void Buy() { Console.WriteLine("股票2买入"); } } class Stock3 { //卖股票 public void Sell() { Console.WriteLine("股票3卖出"); } //买股票 public void Buy() { Console.WriteLine("股票3买入"); } } //国债1 class NationalDebt1 { //卖国债 public void Sell() { Console.WriteLine("国债1卖出"); } //买国债 public void Buy() { Console.WriteLine("国债1买入"); } } //房地产 class Realty1 { //卖股票 public void Sell() { Console.WriteLine("房地产1卖出"); } //买股票 public void Buy() { Console.WriteLine("房地产1买入"); } }
外观类
class Program
{
static void Main(string[] args)//此时用户不需要了解股票,甚至可以对股票一无所知,买了之后,一段时间后再赎回。参与股票的具体买卖都有基金公司完成。客户端代码非常简洁
{
Fund jijin = new Fund(); //用Fund类实例化一个jijin对象,其实是调取了Fund类中的构造函数,实例化了所有基金类控制下的股票,国债,房地产
//基金购买
jijin.BuyFund(); //调取jijin对象的BuyFund()方法,其实是调取了jijin对象中所有子系统的Buy方法
//基金赎回 jijin.SellFund(); //调取jijin对象的SellFund()方法 Console.Read(); } } class Stock1 { //卖股票 public void Sell() { Console.WriteLine("股票1卖出"); } //买股票 public void Buy() { Console.WriteLine("股票1买入"); } } class Stock2 { //卖股票 public void Sell() { Console.WriteLine("股票2卖出"); } //买股票 public void Buy() { Console.WriteLine("股票2买入"); } } class Stock3 { //卖股票 public void Sell() { Console.WriteLine("股票3卖出"); } //买股票 public void Buy() { Console.WriteLine("股票3买入"); } } //国债1 class NationalDebt1 { //卖国债 public void Sell() { Console.WriteLine("国债1卖出"); } //买国债 public void Buy() { Console.WriteLine("国债1买入"); } } //房地产 class Realty1 { //卖股票 public void Sell() { Console.WriteLine("房地产1卖出"); } //买股票 public void Buy() { Console.WriteLine("房地产1买入"); } }
四、涉及知识点
1.访问修饰符
1.public:公有的,外部的所有代码都可以访问
2.private:私有的,只允许同一个类中的成员访问,其他类包括它的子类无法访问
3.protected:保护的,只有子类可以访问
4.internal:同一个项目中的代码访问,类默认是这个
2.关系
本模式中涉及到的关系:
聚合:关联关系的一种,整体和个体的关系,个体可以脱离整体二独立存在
实现:整体的构造方法中包含个体作为参数
图形:空心菱形+实现箭头