喵星之旅-沉睡的猫咪-装饰者模式

装饰者是什么?

装饰者模式是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),动态地给该对象增加一些职责(即增加其额外功能)的模式,属于结构型模式

采用装饰模式扩展对象的功能比采用继承方式更加灵活。

可以设计出多个不同的具体装饰类,创造出多个不同行为的组合。


装饰者如何实现?

jdk中最经典的装饰者实现是io流。会了装饰者就会了io流,同样的会了io流也就会了装饰者。

我们分析一下io流的特点:

最上面有4大接口,掌管者整个io流。

io流的实现类有很多,每一个实现类都有各自的特点,但是又都基于某种基础之上。

创建一个io流的实例,很多时候我们需要创建和他在同一个接口的某个其他实例。

其实上面这些就是装饰者的特点:

最上面是接口,定义基本规则。

装饰者的实现类可能是很多的,每一个都是有各自特点,但是应该有一些属于基础的实现。

我们在创建一个装饰者的实例,很可能需要先创建一个基础的实例。

 

代码实现:

以一个网站的参单栏为例,使用装饰者:

不登录时:问答、文章、精品课、冒泡、商城

登录时:问答、文章、作业、题库、成长墙、精品课、冒泡、商城

实现流程:

创建一个接口,定义基本的功能;

创建一个基础的实现类,作为其他装饰者的依靠;

创建自己的装饰者(实现接口,将基础的实现类或者其他装饰者作为内部属性)。

在装饰者内部更新方法的实现或者扩展新的功能。

代码:

接口

package structure.decorator;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public interface Menu {
    String showMenu();
}

 

实现类

package structure.decorator;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MenuBase implements Menu {

    @Override
    public String showMenu() {
        return "问答、文章、精品课、冒泡、商城";        
    }

}

 

装饰者

package structure.decorator;

/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class MenuDecorator implements Menu {
    private Menu menu;

    public MenuDecorator(Menu menu) {
        super();
        this.menu = menu;
    }

    public Menu getMenu() {
        return menu;
    }

    public void setMenu(Menu menu) {
        this.menu = menu;
    }

    @Override
    public String showMenu() {
        //直接重写并不常见,常见是根据内部的属性menu提供信息来完成。
        //return "问答、文章、作业、题库、成长墙、精品课、冒泡、商城";
        return menu.showMenu() + "、作业、题库、成长墙";
    }

}

 

测试类

package structure.decorator;
/**
 * 
 * @author bunny~~我是兔子我会喵,我叫喵星兔。
 *
 */
public class Test {

    public static void main(String[] args) {
        Menu m1 = new MenuBase();
        Menu m2 = new MenuDecorator(new MenuBase());
        System.out.println(m1.showMenu());
        System.out.println(m2.showMenu());
    }

}

 

ps:项目地址  svn://47.105.188.20/kitty/2%E3%80%81code/pattern    用户名密码:reader/reader


posted @ 2020-03-07 16:17  喵星兔  阅读(114)  评论(0编辑  收藏  举报