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

装饰者是什么?

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

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

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

装饰者如何实现?

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

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

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

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

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

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

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

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

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

代码实现:

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

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

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

实现流程:

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

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

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

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

代码:

接口

1
2
3
4
5
6
7
8
9
package structure.decorator;
/**
*
* @author bunny~~我是兔子我会喵,我叫喵星兔。
*
*/
public interface Menu {
String showMenu();
}

实现类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package structure.decorator;
/**
*
* @author bunny~~我是兔子我会喵,我叫喵星兔。
*
*/
public class MenuBase implements Menu {

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

}

装饰者

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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() + "、作业、题库、成长墙";
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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());
}

}
文章目录
  1. 装饰者是什么?
  2. 装饰者如何实现?
  3. 代码实现:
|