Android设计模式-装饰模式-结构型-3
创建型模式 (3)
行为型模式 (2)
结构型模式 (3)
- Android设计模式Github项目地址: 点击跳转
0. 什么是装饰模式?
允许动态的向一个现用的对象添加新的方法功能,同时也不破坏原对象的结构。
通常我们扩展类的功能是通过继承的方式来实现,但是装饰者模式是通过组合的方式来实现,这是继承的替代方案之一
代理模式的结构
角色 | 类别 | 说明 |
---|---|---|
Component | 抽象组件 | 接口或者抽象类,被装饰的最原始的对象。具体组件与抽象装饰角色的父类 |
ConcreteComponent | 具体组件 | 实现抽象组件的接口 |
Decorator | 抽象装饰角色 | 一般是抽象类,抽象组件的子类,同时持有一个被装饰者的引用,用来调用被装饰者的方法;同时可以给被装饰者增加新的职责 |
ConcreteDecorator | 具体装饰类 | 抽象装饰角色的具体实现 |
1. 优缺点
优点:
1、动态扩展一个实现类的功能
2、装饰类 和 被装饰的类 之间不耦合
缺点:
1、多层装饰比较复杂,过多的话,维护起来比较困难
2、如果要修改抽象组件这个基类的话,后面的一些子类可能也需跟着修改,较容易出错
应用实例:
房间装饰,给家里的某个空间装上灶台,抽油烟机,厨具。那么这个空间就成为了厨房。
为什么要用代理模式?
1、当接收一个旧项目,不得不在其某个对象里扩展功能。为了保证最大程度的完整性不影响app运行,就可以使用代理模式,在不破坏原对象里的结构的同时,也可以添加新功能。
2、避免了在同一个类里不断的扩张功能,使得其十分臃肿的局面。或者是为了扩张一个类,而通过子类继承的方式实现,但是会导致子类过多。
2. 哪些库或方法使用代理模式来实现的?
Context和它的包装类ContextWrapper(其实并没有增强功能)
IO流中的BufferReader
3. 举例说明-小明创建游戏角色
游戏角色:职业必选。
可装饰的内容:头发,裤子,上衣,武器
- 1.
Avatar
/**
* 角色:component抽象类,代表玩家角色,定义方法
*/
public interface Avatar {
String describe();
}
- 2.
Profession
/**
* 角色:concreteComponent具体实现类,玩家职业
*/
public class Profession implements Avatar{
@Override
public String describe() {
return "小明的创建的游戏角色是>> 职业:战士";
}
}
- 3.
AvatarDecorator
/**
* 装饰类,实现avatar的接口方法,并持有avatar对象的引用
*/
public class AvatarDecorator implements Avatar {
//持有原接口对象引用
private Avatar avatar;
public AvatarDecorator(Avatar avatar){
this.avatar = avatar;
}
@Override
public String describe() {
return avatar.describe();
}
}
- 4.
Bottom
/**
* 装饰-裤子
*/
public class Bottom extends AvatarDecorator {
public Bottom(Avatar avatar) {
super(avatar);
}
@Override
public String describe() {
return super.describe()+" 裤子:牛仔裤";
}
}
* 5.`Top`
```java
/**
* 装饰-上衣
*/
public class Top extends AvatarDecorator {
public Top(Avatar avatar) {
super(avatar);
}
@Override
public String describe() {
return super.describe()+" 上衣:锁子甲";
}
}
- 6.
Weapon
/**
* 装饰-武器
*/
public class Weapon extends AvatarDecorator {
public Weapon(Avatar avatar) {
super(avatar);
}
@Override
public String describe() {
return super.describe()+" 武器:开山斧";
}
}
- 7.
Hair
/**
* 装饰-头发
*/
public class Hair extends AvatarDecorator {
public Hair(Avatar avatar) {
super(avatar);
}
@Override
public String describe() {
return super.describe()+" 头发:红头发";
}
}
- 8.
DecoratorPatternActivity
public class DecoratorPatternActivity extends AppCompatActivity {
public static String TAG = "装饰者:>> ";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_decorator_pattern);
Avatar avatar = new Weapon(new Hair(new Top(new Bottom(new Profession()))));
System.out.println(TAG+ avatar.describe());
}
}
运行后的结果是:
4. Android技术生活交流
微信