/**
* 装饰模式:
* 动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类对象(继承)更为灵活。装饰模式一种对象结构模式。
* 通常会定义一个抽象的装饰类,然后将具体的装饰类作为他的子类,然后继承具体的装饰类。
* <p>
* 优点:装饰类和被装饰类可以独立发展,不会相互耦合;对于扩展一个对象的功能,装饰模式比继承更加的灵活,不会导致类的个数急剧增加。
* 缺点:多层装饰比较复杂。
* <p>
* 使用场景:
* 1、扩展一个类的功能。
* 2、动态增加功能,动态撤销。
* <p>
* 设计原则:
* 1、多用组合,少用继承。
* 2、对扩展开放,对修改关闭。
* <p>
* android中应用:java中I/O便使用了装饰者模式 (InputStream)
*/
public class DecorateTest {
public static void main(String[] args) {
Component shoe = new Nike();
shoe = new Color(shoe);
shoe = new Price(shoe);
shoe = new Size(shoe);
// print: Nike, 白色, ¥799, 42
System.out.println(shoe.des());
}
}
/**
* 装饰模式接口
*/
public interface Component {
String des();
}
/**
* 被装饰者(一个具体的组件)
*/
public class Nike implements Component{
@Override
public String des() {
return "Nike";
}
}
/**
* 装饰者抽象类
*/
public abstract class ShoeDecorator implements Component {
protected Component component;
public ShoeDecorator(Component component) {
this.component = component;
}
}
**
* 颜色装饰
*/
public class Color extends ShoeDecorator {
public Color(Component component) {
super(component);
}
@Override
public String des() {
return component.des() + ", 白色";
}
}
/**
* 价格装饰
*/
public class Price extends ShoeDecorator {
public Price(Component component) {
super(component);
}
@Override
public String des() {
return component.des() + ", ¥799";
}
}
/**
* 鞋码装饰
*/
public class Size extends ShoeDecorator {
public Size(Component component) {
super(component);
}
@Override
public String des() {
return component.des() + ", 42";
}
}
网友评论