zgq105 / blog

2 stars 0 forks source link

设计模式之装饰者模式 #46

Open zgq105 opened 5 years ago

zgq105 commented 5 years ago

image

1. 什么是装饰者模式?有什么作用?

装饰者模式是指通过包装的形式且不修改原有类结构的基础上添加新的功能,属于结构型设计模式。它的主要作用是不增加很多子类的情况下扩展类的功能。

2. 如何实现?

//定义原始接口

public interface Programmer {
    void code();
}

//定义原始接口实现类

public class JavaProgrammer implements Programmer{

    @Override
    public void code() {
        System.out.println("写java代码");
    }
}
public class PythonProgrammer implements Programmer{

    @Override
    public void code() {
        System.out.println("写Python代码");
    }
}

//定义装饰者抽象类,同时实现原始接口

public abstract class DecorateProgrammer implements Programmer{
    protected Programmer mProgrammer;

    public DecorateProgrammer(Programmer programmer){
        this.mProgrammer=programmer;
    }

    public void code(){
        mProgrammer.code();
    }
}

//定义装饰者实现类

public class DecorateJavaProgrammer extends DecorateProgrammer {
    public DecorateJavaProgrammer(Programmer programmer) {
        super(programmer);
    }

    @Override
    public void code() {
        mProgrammer.code();
        System.out.println("java程序员还会设计模式");
    }
}
public class DecoratePythonProgrammer extends DecorateProgrammer {
    public DecoratePythonProgrammer(Programmer programmer) {
        super(programmer);
    }

    @Override
    public void code() {
        mProgrammer.code();
        System.out.println("Python程序员还会设计模式");
    }
}

//使用装饰者模式

DecorateJavaProgrammer decorateJavaProgrammer = new DecorateJavaProgrammer(new JavaProgrammer());
decorateJavaProgrammer.code();
DecoratePythonProgrammer decoratePythonProgrammer = new DecoratePythonProgrammer(new PythonProgrammer());
decoratePythonProgrammer.code();

注:关键点是确定好装饰者和被装饰者。

3. JDK或Android的应用举例

在JDK中BufferedReader使用的就是装饰者模式;在Android中,ContextWrapper的设计就是使用了装饰者模式。

4. 小结

装饰者模式的优缺点: 优点:

缺点: