Java设计模式之装饰者模式

装饰者模式的概念

装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。装饰者模式通过运用类的组合,少运用继承,使得程序更加的灵活,但是也使得程序更加的复杂,所以如果过多的使用,也会使得程序太过复杂。

装饰者模式的原则

1. 多组合,少继承。

2. 类应设计的对扩展开放,对修改关闭。

通过实例学习装饰者模式

装饰者模式,通过装饰二字可以很好的理解,就是通过使用类的组合,对类进行装饰,使得给主类附加一些属性,使其变成我们所需要的类。装饰者模式适用的场景就是需要通过主类扩展出许多子类,从而可能造成类的数量剧增的场景。其实装饰者模式可以找到的适用场景很多,接下来从LOL中的英雄买装备来学习一下设计模式。

在LOL中,我们通过买装备,来增加攻击类,法强,护甲等属性,然后英雄之间互相攻击,除了基础属性,再考虑进去这些装备附加的属性,然后就可以计算出伤害量。在这种场景下,英雄不就是被装饰类吗?而装备,就是装饰类,可以通过下面的一个图来直观的理解一下他们之间的关系:

我们在抽象了类中定义子类中必须要实现的方法,运用组合,将英雄抽象类放在装备类中进行装饰。先来看一下英雄抽象类的代码

public abstract class Hero {

    public String description;

    public String getDescription() {
        return description;
    }

    public abstract double power();
}

在英雄抽象类中我们定义了抽象方法power()表示战斗力,这个power()是英雄类和装备类都应该实现的,然后getDescription()我们并没有定义为抽象方法,而是写成了一个普通方法,因为这个方法是被装饰类(英雄类)独有的,并且是通用的,和装饰类(装备类)是有区别的,如果定义为抽象方法,就需要在装饰类的子类中再进行实现,我们再来看一下装备抽象类的代码

public abstract class Equipment extends Hero {

    public abstract String getDescription();
}

装备抽象类的代码很简单,就是继承英雄抽象类,然后自己定义了一个抽象方法getDescription()。我们上边说到英雄抽象类中的getDescription()方法是英雄类通用的,和装备类的有区别,所以我们在这里定义装备类自己的getDescription()方法。接下来我们再来看一下英雄类的代码

public class Planck extends Hero {

    public Planck() {
        description = "海洋之灾-普朗克";
    }

    @Override
    public double power() {
        return 9.27;
    }
}

在英雄类中,我们给抽象类中的description赋值英雄的名字,在power()方法中返回这个英雄的战斗力。然后我们来看一下装备类如何装饰英雄类,看一下装备类的代码

public class TrinityForce extends Equipment {

    Hero hero;

    public TrinityForce(Hero hero) {
        this.hero = hero;
    }

    @Override
    public String getDescription() {
        return hero.getDescription() + ",三相之力";
    }

    @Override
    public double power() {
        return hero.power() + 8.3;
    }
}

在装备类中,我们运用了组合,我们声明了一个英雄抽象类,然后在构造方法中获取到需要装饰的英雄类,进行修饰。在装备类中我们需要实现的两个功能:获取到英雄类的描述,然后加上装备的描述;获取到英雄类的战斗力,然后加上装备的战斗力,这样就达到了装饰的目的。然后我们来看一下测试方法的代码,看看如何使用它们:

public class TestPattern {

    public static void main(String[] args) {

        Hero planck = new Planck();
        planck = new Manamune(new TrinityForce(planck));

        System.out.println(planck.getDescription() + ":战斗力 " + planck.power());
    }
}

 海洋之灾-普朗克,三相之力,魔宗:战斗力 25.37

在这里我们给船长买了三相之力和魔宗两件装备,对船长进行装饰,然后输出总的描述和总的战斗力,这样子我们就不必专门实现一个买了三相之力和魔宗的船长类了,只需要用三相之力和魔宗对船长进行修饰就可以达到目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值