设计模式网上资料整合理解——结构型模式

本文介绍了桥接模式、组合模式、享元模式及代理模式的概念与应用场景,并通过.NET控件树和代理模式的代码示例来深入浅出地解析这些模式的特点。

桥接模式(Bridge)
      桥接模式用于解决系统多维度变化的问题,将抽象部分与实现部分分离,使它们都可以独立的变化。(参见对Bridge模式的理解
结构图:
      
生活中的例子:
      
      

组合模式(Composite)

意图:
      将对象组合成树形结构以表示“部分-整体”的层次结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。[GOF 《设计模式》]
生活中的例子:
      组合模式最佳例子是.NET的控件树,具体参考张逸的《设计之道》,或看.NET控件源码。
结构图:
      

享原模式(FlyWeight)
      当在一个线程中需要创建一个类的很多实例,而这个类的实例之间只是某些状态不同,就可以考虑是否可以将类中实例化后不同的部分提取出来,以使剩余的部分得以共享,减少内存开销。这种解决方法就是享原模式,它主要是解决上面提到的性能问题。

结构图:
      

代理模式(Proxy)

结构图:
      
代码:

None.gif using  System;
None.gif
None.gif
namespace  DoFactory.GangOfFour.Proxy.Structural
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif  
InBlock.gif  
// MainApp test application 
InBlock.gif

InBlock.gif  
class MainApp
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
// Create proxy and request a service 
InBlock.gif
      Proxy proxy = new Proxy();
InBlock.gif      proxy.Request();
InBlock.gif
InBlock.gif      
// Wait for user 
InBlock.gif
      Console.Read();
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
// "Subject" 
InBlock.gif

InBlock.gif  
abstract class Subject 
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
public abstract void Request();    
ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
// "RealSubject" 
InBlock.gif

InBlock.gif  
class RealSubject : Subject
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    
public override void Request()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      Console.WriteLine(
"Called RealSubject.Request()");
ExpandedSubBlockEnd.gif    }

ExpandedSubBlockEnd.gif  }

InBlock.gif
InBlock.gif  
// "Proxy" 
InBlock.gif

InBlock.gif  
class Proxy : Subject
ExpandedSubBlockStart.gifContractedSubBlock.gif  
dot.gif{
InBlock.gif    RealSubject realSubject;
InBlock.gif
InBlock.gif    
public override void Request()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
// Use 'lazy initialization' 
InBlock.gif
      if (realSubject == null)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
dot.gif{
InBlock.gif        realSubject 
= new RealSubject();
ExpandedSubBlockEnd.gif      }

InBlock.gif
InBlock.gif      realSubject.Request();
ExpandedSubBlockEnd.gif    }
  
ExpandedSubBlockEnd.gif  }

ExpandedBlockEnd.gif}

None.gif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值