给T50型坦克加上,夜视,两栖,卫星定位等拓展功能
sufferedWay...
![ContractedBlock.gif](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
//传统的做法
//每一种需要扩展的坦克型号都需要写一个新的更加复杂的类
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](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![ExpandedBlockStart.gif](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
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();
}
}