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();
}
}
/**
* 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();
}
}