学习了外观模式,才发现原来不经义间,自己已经不止一次的用过此模式了。

 

     外观模式强调,外部(客户端)与子系统之间通过一个统一的接口(外观)进行通信。也就说,一个系统中可能包括很多子系统,客户端与其中的任何子系统的通信都通过统一的外观实现,而避免使客户端直接与子系统发生关系。

     

     记得曾经有个项目:数据操作涉及三地三个数据库,也就是说每做一个动作(比如说insert),都要insert到三地去,涉及三个数据库。

         

     记得最初的代码是这样写的:(当时是把三个类写成了一个类中三个方法,为了说明问题,这里分开来写)
     

 Demo1
{
    class Program
    {
        
static void Main(string[] args)
        {
            DBOpOne one 
= new DBOpOne();
            DBOpTwo two 
= new DBOpTwo();
            DBOpThree three 
= new DBOpThree();

            one.insertSiteOne();
            two.insertSiteTwo();
            three.insertSiteThree();

            Console.Read();
        }
    }
    class DBOpOne
    {
        
public void insertSiteOne()
        {
            Console.WriteLine(
"Insert data into site one ");
        }
    }
    
class DBOpTwo
    {
        
public void insertSiteTwo()
        {
            Console.WriteLine(
"Insert data into site Two ");
        }
    }
    
class DBOpThree
    {
        
public void insertSiteThree()
        {
            Console.WriteLine(
"Insert data into site Three ");
        }
    }

}

     后来,由于某些原因,三地中某地不再作业,数据库被撤掉。那么这个系统就要做相应的修改:系统中只要用到数据库作业的地方都要把三地作业换成两地作业(把其中某句注释掉)。郁闷之极~~

          

     根据需求,之后做了一些调整:把三地作业封装再一个类中,而在客户端使用这个封装的类就可以了。如果,需求有变,也只是更改这个封装的类即可(所有的操作都集中在这里了)。现在看来,这个就是外观模式的应用了。

 Demo2
{
    class Program
    {
        
static void Main(string[] args)
        {
            DBOp cDal 
= new DBOp();
            cDal.insertSite();

            Console.Read();
        }
    }

    class DBOp
    {
        
public void insertSite()
        {
            DBOpOne one 
= new DBOpOne();
            DBOpTwo two 
= new DBOpTwo();
            DBOpThree three 
= new DBOpThree();

            one.insertSiteOne();
            two.insertSiteTwo();
            three.insertSiteThree();
        }
    }

    class DBOpOne
    {
        
public void insertSiteOne()
        {
            Console.WriteLine(
"Insert data into site one ");
        }
    }
    
class DBOpTwo
    {
        
public void insertSiteTwo()
        {
            Console.WriteLine(
"Insert data into site Two ");
        }
    }
    
class DBOpThree
    {
        
public void insertSiteThree()
        {
            Console.WriteLine(
"Insert data into site Three ");
        }
    }

}

1.为一个复杂子系统提供一个简单接口。

2.提高子系统的独立性。

3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

 

     学习参考:
     http://www.cnblogs.com/Terrylee/archive/2006/03/17/352349.html

     http://www.cnblogs.com/zhenyulu/articles/55992.html

     大话设计模式:外观模式