欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件构造-decorator 设计模式

程序员文章站 2022-03-10 14:15:01
...

在设计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<>());