理解设计模式之装饰器模式

来源:互联网 发布:oracle .sql如们运行 编辑:程序博客网 时间:2024/04/29 23:36

概述

向一个现有的对象添加新的功能,同时又不改变其结构。

设计原则

对扩展开发,修改关闭。

简要说明

装饰者模式是对现有对象进行装饰,通过装饰,我们的对象对同一种行为可以产生不同的效果,或者说通过装饰后,我们的对象通过调用同一种方法,能够实现在不影响原有功能的基础上增加新的功能。

关系图

这里写图片描述
从关系图可以看出具体类和装饰类都有一个相同的超类,而这个超类就是他们的联系(具有相同的方法)。装饰类,其实仅仅是给具体类加上的一些新东西,他们本质上还是同一种类型(拥有同一个超类)。

使用场景

扩展一个类的功能,并且可以保留已有的功能,通过继承可以实现,不利于我们的扩展,如果以后需要继续新增,我们只能采用多重继承,如果在想改变某一种功能,这时会导致后面所有的功能发生改变。因此装饰者模式利用了组合方式实现。

举例说明

现在有个APP的登录功能,我们需要在登录的时候根据需要选择登录QQ和微博(已经通过授权)。

//同一个行为接口public interface IBehavior{    void login();}//被装饰类public class App implements IBehavior{    public void login(){        System.out.println("登录APP自身系统");    }}//装饰抽象类public abstract class Decorator implements IBehavior{    private App app;    public Decorator(App app){        this.app = app;    }    public void login(){        app.login();    }}//具体装饰类01public class Decorator_01 extends Decorator{    public Decorator_01(App app){        super(app);    }    @Override    public void login(){        super.login();        System.out.println("新增登录QQ的功能");    }}//具体装饰类02public class Decorator_02 extends Decorator{    public Decorator_02(App app){        super(app);    }    @Override    public void login(){        super.login();        System.out.println("新增登录微博的功能");    }}//测试类public class Test{    public static void main(String[] args){        //没有任何修饰        IBehavior app = new App();        app.login();        System.out.println("-----------");        //添加一个QQ登录的功能,保留原App登录        Decorator d1 = new Decorator_01(app);        d1.login();        System.out.println("-----------");        //添加一个微博登录的功能,保留QQ登录和原App登录        Decorator d2 = new Decorator_02(d1);        d2.login();    }}//输出登录APP自身系统-------------登录APP自身系统新增登录QQ的功能-------------登录APP自身系统新增登录QQ的功能新增登录微博的功能
原创粉丝点击