设计模式之装饰者模式
装饰者模式目标把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活
装饰者模式角色
抽象组件角色
给出一个抽象接口
具体组件角色
定义一个将要增加附加功能的类,相当于父类
抽象装饰者角色
持有一个组件对象的实例,并且实现抽象组件接口
具体装饰者角色
负责给组件对象添加附加的功能,相当于子类
装饰者模式示例
以一件商品被卖出为例,
//抽象组件角色 Commodity.java
public interface Commodity {
public void beSoldOut();
}
//具体组件角色
public class Book implements Commodity {
@Override
public void beSoldOut() {
System.out.println("书被卖出去了");
}
}
//抽象装饰者角色 Decorator.java
//实现了抽象组件接口
public abstract class Decorator implements Commodity {
Commodity commodity; //持有组件对象的实例
Decorator(Commodity commodity){
this.commodity=commodity;
}
@Override
public void beSoldOut() {
commodity.beSoldOut();
}
}
//具体装饰者角色:增加了折扣的功能 DiscountDecorator.java
public class DiscountDecorator extends Decorator {
public DiscountDecorator(Commodity commodity) {
super(commodity);
}
public void discount(){
System.out.println("再送一件相同的商品");
}
@Override
public void beSoldOut() {
// TODO Auto-generated method stub
super.beSoldOut();
discount();
}
}
//具体装饰者角色:再次折扣促销DiscountAgainDecorator.java
public class DiscountAgainDecorator extends Decorator {
public DiscountAgainDecorator(Commodity commodity){
super(commodity);
}
public void discountAgain(){
System.out.println("再送一件价格低一点的商品");
}
@Override
public void beSoldOut() {
super.beSoldOut();
discountAgain();
}
}
//客户端测试类 testDecorator.java
public class testDecorator {
public void static main(String[] args) {
Commodity book = new Book();
Decorator decorator = new DiscountAgainDecorator(new DiscountDecorator(book));
decorator.beSoldOut(www.9ask.cn/cz/);
}
}
页:
[1]