装饰模式

public class Test {

/**
* 1)
* Decorator模式应用的要点在于解决“主体类在多个方向上的扩展功能”------是为“装饰”的含义。
* 通过采用组合、而非继承的手法,Decorator模式实现了在运行时动态地扩展对象功能的能力,
* 而且可以根据需要扩展多个功能。避免了单独使用继承带来的“灵活性差"和"多子类衍生问题"。
* 2
* 应用场景: 1)需要扩展一个类的功能,或给一个类增加附加责任
2)需要动态给一个对象增加功能,这些功能可以再动态的撤销
3)需要增加有一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变得不现实
特点: 1)装饰对象(Decorator)和真实对象(Tank50,Tank75)有相同的接口(Tank)
2)装饰对象中有个真实对象的索引
缺点: 1)产生比继承少的多的类, 但在调用时,是功能装饰类的组合,
2)所以可能比继承产生更多的对象(因为要new功能装饰类才能对类进行功能扩展)
* @param args
* super的作用调用父类的属性或方法,在构造中必须要写在第一句,否则编译通不过
*/
public static void main(String[] args) {
// DecoratorA,DecoratorB主要体现在功能的扩展, 父子继承关系只有两层,避免多层(复杂)
// 注意每一个装饰类 Decorator 都继承Tank类,构造(构造中传递Tank)和方法中都有super,等于一层层的调用
Tank tank = new Tank50();
Tank tank2 = new Tank75();
DecoratorA da = new DecoratorA(tank); // 且有红外功能
DecoratorB db = new DecoratorB(da); // 且有红外和水陆两栖功能
db.Shot();
}

}
一.
public abstract class Tank {
public abstract void Shot();

public abstract void Run();

}
二.
public class Tank50 extends Tank {

@Override
public void Run() {

System.out.println("run========50");
}

@Override
public void Shot() {
// TODO Auto-generated method stub
System.out.println("shot========50");
}

}

三.抽象装饰类
public abstract class Decorator extends Tank {

private Tank tank; // Has a 对象组合

public Decorator(Tank tank)

{
this.tank = tank;
}

@Override
public void Run() {
// TODO Auto-generated method stub
tank.Run();
}

@Override
public void Shot() {
// TODO Auto-generated method stub
tank.Shot();
}


}
四.具体装饰类
public class DecoratorA extends Decorator {

public DecoratorA(Tank tank) {
super(tank);
// TODO Auto-generated constructor stub
}

public void Shot()

{

// Do some extension //功能扩展 且有红外功能
System.out.println("a.........");
super.Shot();

}

public void Run()

{

super.Run();

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值