Decorator装饰模式

给T50型坦克加上,夜视,两栖,卫星定位等拓展功能

sufferedWay...

ContractedBlock.gif ExpandedBlockStart.gif old
//传统的做法
//每一种需要扩展的坦克型号都需要写一个新的更加复杂的类

public class Tank
{
    
abstract void Shot();
    
abstract void Run();
}


public class T50 : Tank
{
    
public override void Shot()
    { 

    }
    
public override void Run()
    { 

    }
}

public class T75 : Tank
{
    
public override void Shot()
    {

    }
    
public override void Run()
    {

    }
}

public class T90 : Tank
{
    
public override void Shot()
    {

    }
    
public override void Run()
    {

    }
}

public interface IA
{
    
void ShotA();
    
void RunA();
}

public class T50 : Tank, IA
{
    
private void IA.ShotA()
    {
        
    }

    
private void IA.RunA()
    {
        
    }

    
public override void Shot()
    {
        
this.ShotA();//功能扩展

        
//do shot
        base.Shot();
    }
    
public override void Run()
    {
        
this.RunA();//功能扩展

        
//do run
        base.Run();
    }



}

 

Decorator Menthod:

ContractedBlock.gif ExpandedBlockStart.gif dec
public abstract class Tank
{
    
public abstract void Shot();
    
public  abstract void Run();
}

public abstract class Decorator : Tank //接口继承
{
    
private Tank _tank; //HAS-A 对象组合
    public Decorator(Tank _tank)
    {
        
this._tank = _tank;
    }

    
public override void Shot()
    {
        _tank.Shot();
    }

    
public override void Run()
    {
        _tank.Run(); 
    }
}

//各型号坦克的实现
public class T50 : Tank
{
    
public override void Shot()
    {

    }
    
public override void Run()
    {

    }
}

public class T75 : Tank
{
    
public override void Shot()
    {

    }
    
public override void Run()
    {

    }
}

public class T90 : Tank
{
    
public override void Shot()
    {

    }
    
public override void Run()
    {

    }
}


//各功能拓展装饰
public class DecoratorA : Decorator
{
    
public DecoratorA(Tank tank)
        : 
base(tank)
    { }

    
public override void Shot()
    {
        
//Do some extension 
        
//红外
        base.Shot();
    }
    
public override void Run()
    {
        
//Do some extension
        
//两栖拓展
        base.Run();
    }
}

public class DecoratorB : Decorator
{
    
public DecoratorB(Tank tank)
        : 
base(tank)
    { }

    
public override void Shot()
    {
        
//Do some extension 
        
//两栖
        base.Shot();
    }
    
public override void Run()
    {
        
base.Run();
    }
}

public class DecoratorC : Decorator
{
    
public DecoratorC(Tank tank)
        : 
base(tank)
    { }

    
public override void Shot()
    {
        
//Do some extension 
        
//卫星定位
        base.Shot();
    }
    
public override void Run()
    {
        
//Do some extension
        base.Run();
    }
}

//外部调用

class App
{
    
public static void Main()
    {
        Tank tank 
= new T50();
        DecoratorA da 
= new DecoratorA(tank);//红外
        DecoratorB db = new DecoratorB(da);//红外,两栖
        DecoratorC dc = new DecoratorC(db);//红外,两栖,卫星定位
        dc.Shot();
    }
}

转载于:https://www.cnblogs.com/stupid-fool/archive/2009/05/05/1450037.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值