java-设计模式-装饰者模式

设计模式-装饰者模式
    动态地给一个对象添加一些额外的职责。
    组件 -> 具体组件
         -> 装饰者(组件)
            ->具体装饰者

    Component :定义了一个可以被动态添加功能的接口
    Decorator :持有一个Component对象的引用,并且定义了一个和Component保持一致的接口。
    ConcreteDecorator :为Component添加功能的角色。

装饰者模式关键的设计就是 组件接口,然后装饰者和具体的角色都去实现这个接口。

下面用装饰者模式 实现 战士 装备不同的武器 战斗力变化的情况。

先定义一个component

/**
 * 装饰者模式 组件抽象接口
 * 战士 组件抽象接口
 */
public interface SoldierComponent {
    int getPower();
}

具体的战士类ConcreteDecorator :

public class Soldier implements SoldierComponent {

    @Override
    public int getPower() {
        System.out.println("战士,基础战斗力 50");
        return 50;
    }
}

装备接口Decorator :


/**
 * 武器装备类
 * 实现 战士组件接口
 * 组合 战士组件
 *
 */
public class EquipDecorate implements SoldierComponent {
    /**
     * 注意 此处作用域需要 protected,让本包内的子类也可以用到
     */
    protected SoldierComponent component;
    public EquipDecorate(SoldierComponent component){
        this.component = component;
    }
    @Override
    public int getPower() {
        return component.getPower();
    }
}

具体的装备类 铠甲类


/**
 * 铠甲 装备装饰器
 */
public class ArmourEquipDecorate extends EquipDecorate{
    public ArmourEquipDecorate(SoldierComponent component) {
        super(component);
    }

    @Override
    public int getPower() {
        int power = super.getPower();
        power += 120 ;
        System.out.println("使用 武器-铠甲 增加 战斗力:"+120+" 总战斗力:"+power);
        return power;
    }
}

具体的装备类 剑类


import java.util.Random;

/**
 * 武器-剑
 */
public class SwordEquipDecorate extends EquipDecorate{

    public SwordEquipDecorate(SoldierComponent component) {
        super(component);
    }

    public int effect(){
        int randomPower = new Random().nextInt(100);
        System.out.println("使用 武器-剑 随机增加战斗力"+randomPower);
        return randomPower;
    }

    @Override
    public int getPower() {
        int power = super.getPower();
        int addPower = 100 + effect();
        power += addPower;
        System.out.println("使用 武器-剑 增加 战斗力:"+addPower+" 总战斗力:"+power);
        return power;
    }
}

测试类:


public class DecorateTest {
    public static void main(String[] args) {
        System.out.println("---------新建一个战士类--------------");
        SoldierComponent soldier = new Soldier();
        System.out.println("******战士的战斗力"+soldier.getPower());
        System.out.println("---------给战士装备铠甲--------------");
        ArmourEquipDecorate armourEquipDecorate = new ArmourEquipDecorate(soldier);
        System.out.println("******铠甲战士的战斗力"+armourEquipDecorate.getPower());
        System.out.println("---------给铠甲战士装备剑--------------");
        SwordEquipDecorate swordEquipDecorate = new SwordEquipDecorate(armourEquipDecorate);
        System.out.println("******铠甲剑战士的战斗力1:"+swordEquipDecorate.getPower());
        System.out.println("******铠甲剑战士的战斗力2:"+swordEquipDecorate.getPower());
    }
}

测试结果:

---------新建一个战士类--------------
战士,基础战斗力 50
******战士的战斗力50
---------给战士装备铠甲--------------
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
******铠甲战士的战斗力170
---------给铠甲战士装备剑--------------
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
使用 武器-剑 随机增加战斗力64
使用 武器-剑 增加 战斗力:164 总战斗力:334
******铠甲剑战士的战斗力1:334
战士,基础战斗力 50
使用 武器-铠甲 增加 战斗力:120 总战斗力:170
使用 武器-剑 随机增加战斗力75
使用 武器-剑 增加 战斗力:175 总战斗力:345
******铠甲剑战士的战斗力2:345
发布了60 篇原创文章 · 获赞 6 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/xiaoluo5238/article/details/104609596
今日推荐