问题提出
为一个模特穿衣服。要求根据用户的需求能够有不同的装扮。(注意要符合我们的几个原则——依赖倒转,开放闭合,单一职责等)。
穿衣过程暴露在外
class Main {
public static void main(String args[]) {
Model model = new Model("模特A");
Clothes c1 = new Thirts();
c1.show();
Clothes c2 = new Pants();
c2.show();
}
}
class Model
{
public Model(String name) {
System.out.println(name+":");
}
}
interface Clothes
{
void show();
}
class Thirts implements Clothes
{
public void show()
{
System.out.println("穿T恤衫");
}
}
class Pants implements Clothes
{
public void show()
{
System.out.println("穿短裤");
}
}
结果为:
模特A:
穿T恤衫
穿短裤
写完上面的代码,大家有没有发现一个问题:其实我们的Model类与衣服之间并没有什么联系,而且我们穿衣服的过程是完全暴露在main方法里面的,安全性大大下降。
针对上面代码的问题:我们就需要进行代码的修改。加强模特与服装之间的联系,然后把穿衣过程隐藏起来。
装饰模式
class Main {
public static void main(String args[]) {
Model model = new Model("模特A");
Thirts thirts = new Thirts(model);
Pants pants = new Pants(thirts);
pants.show();
}
}
class Model
{
String name;
public Model() {
}
public Model(String name) {
this.name = name;
}
void show() {
System.out.println(name+":");
}
}
class Thirts extends Model
{
Model model;
public Thirts(Model model) {
this.model = model;
}
void show()
{
if (model!=null) {
model.show();
System.out.println("穿T恤衫");
}
}
}
class Pants extends Model
{
Model model;
public Pants(Model model) {
this.model = model;
}
void show()
{
if (model!=null) {
model.show();
System.out.println("穿短裤");
}
}
}
装饰模式(Decorator)动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。
不知道大家看上面装饰模式的代码是否能看懂:如问题所述,就是给一个模特穿衣服的过程。在每一个衣服类里面保存一个model对象,然后重写model的show()方法,添加自己的独特方法然后再调用model自己的show()方法(目的是把之前装饰过的操作也做一遍)。装饰过程是一步一步来的,添加一个功能就是一个单独的步骤。大家仔细理解一下应该不难。
装饰模式的类图如下:
* @startuml
* class Model{
* Model()
* show():void
* }
* Model<|--Thirts
* Model<--Thirts
* class Thirts{
* Model:model
* Thirts(model)
* void show()
* }
* Model<|--Pants
* Model<--Pants
* class Pants{
* Model model
* Pants(model)
* void show()
* }
* @enduml