软件构造-decorator 设计模式

在设计ADT时,我们可能会遇到需要在一些通用操作上添加不同特性的问题,这时候如果只是简单的使用继承就可能会出现组合爆炸的问题,产生庞大而复杂的继承树,为了解决这些问题,使用decorator设计模式无疑是一种很好的办法。

decorator的实现方式

        首先我们需要定义一个接口里面包含了装饰物执行的公共操作,为了方便理解我们举一个实际的例子,例子的目的是通过add、remove,isexist这一组通用操作来实现ADT:集合(即没有重复的元素)。

//通用操作
public interface vector<L>{
    //向容器中添加一个元素
    public void add(L element);
    //移除一个容器中的元素
    public void remove(L element);
    //判断一个元素是否存在
    public boolean isexist(L element);
}

        之后我们要使用一个类来实现这些通用操作

public class CommonVector<L> implements vector<L>{
    private List<L> array=new ArrayList<>();
    
    public void add(L element){
        array.add(element);
    }
    
    public void remove(L element){
        array.remove(element);
    }   
    
    public boolean isexist(L element){
        return array.contains(element);
    } 
}

         我们还需要定义一个抽象类,它是所有装饰类的基类,里面包含的成员变量。

//装饰类的基类
public abstract class Decorator<L> implements vector<L>{

//将操作委托给一个vector<L>类的实例
    protected vector<L> vec;

    public Decorator(vector<L> vec){
        this.vec=vec;
    }

    public void add(L element){
        vec.add(element);
    }

    public void remove(L element){
        vec.remove(element);
    }
    
    public boolean isexist(L element){
        return vec.isexist(element);
    }
}

        现在我们就可以开始写装饰类了。

//实现装饰类:集合
public class set<L> extends Decorator<L>{
    
    public set(vector<L> vec){
        super(vec);
    } 
    
    public void add(L element){
        if(!isexist(element))
            super.add(element);
    }
}

         至此我们就可以使用装饰类来创建一个集合了

//set就是我们想要的集合容器
vector<Integer> set=new set<>(new CommonVector<>());

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值