Android设计模式-装饰模式-结构型-(3)

本文详细介绍了装饰模式的概念、优缺点,以及在Android开发中的实际应用。通过创建游戏角色的例子展示了如何使用装饰模式动态扩展功能,如职业、装备等。此外,还提到了代理模式在Context和IO流中的应用。最后,讨论了装饰模式在保持代码灵活性和减少耦合方面的价值。
摘要由CSDN通过智能技术生成

创建型模式 (3)

简单工厂、工厂法、抽象工厂模式单例模式建造者模式

行为型模式 (2)

观察者模式策略模式

结构型模式 (3)

适配器模式代理模式装饰模式


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技术生活交流

微信



[1]* 参考文章
[2]* 参考文章
[3]* 参考文章
[4]* 参考文章
[5]* 参考文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值