装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
demo
入口类
package decorator_method_mod;
import org.junit.Test;
/**
* 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
*
* 这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
*
* 我们可以通过继承和组合的方式来给一个对象添加行为,虽然使用继承能够很好拥有父类的行为,但是它存在几个缺陷:一、对象之间的关系复杂的话,系统变得复杂不利于维护。二、容易产生“类爆炸”现象。三、是静态的。在这里我们可以通过使用装饰者模式来解决这个问题。
*
* 装饰者模式,动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更加有弹性的替代方案。虽然装饰者模式能够动态将责任附加到对象上,但是他会产生许多的细小对象,增加了系统的复杂度。
*
*/
public class Client {
@Test
public void test(){
Tiger tiger = new Tiger();
SuperTiger flyTiger = new FlyTiger(tiger);
SuperTiger swimTiger = new SwimTiger(flyTiger);
swimTiger.play();
//tiger can run
//tiger can fly
//tiger can swim
}
}
具体类,原始类 老虎
package decorator_method_mod;
/**
* ConcreteComponent: 具体构件
*/
public class Tiger implements Birds {
@Override
public void play() {
System.out.println(String.format("tiger can run"));
}
}
接口
package decorator_method_mod;
/**
* Component: 抽象构件
*/
public interface Birds {
public void play();
}
抽象装饰类 超级老虎
package decorator_method_mod;
/**
* Decorator: 抽象装饰类
*/
public abstract class SuperTiger implements Birds {
private Birds birds;
public SuperTiger(Birds birds){
this.birds = birds;
}
@Override
public void play() {
birds.play();
}
}
超级老虎实现类 飞虎
package decorator_method_mod;
/**
* ConcreteDecorator: 具体装饰类
*/
public class FlyTiger extends SuperTiger {
public FlyTiger(Birds birds) {
super(birds);
}
@Override
public void play() {
super.play();
fly();
}
public void fly(){
System.out.println(String.format("tiger can fly"));
}
}
超级老虎实现类 游泳虎
package decorator_method_mod;
/**
* ConcreteDecorator: 具体装饰类
*/
public class SwimTiger extends SuperTiger {
public SwimTiger(Birds birds) {
super(birds);
}
@Override
public void play() {
super.play();
swim();
}
public void swim(){
System.out.println(String.format("tiger can swim"));
}
}