java-装饰者模式

本文详细介绍了装饰者模式如何动态为对象添加功能,如为人物角色添加衣物。通过Zhangsan和装饰者类的实例,展示了如何避免继承带来的问题,实现功能的灵活扩展。重点在于装饰者模式的原理、适用场景和优缺点。
摘要由CSDN通过智能技术生成

装饰者模式

介绍
简单点来说,就是为这个对象动态的赋予它其他的功能。
装饰者模式是动态的将责任附加到对象上(引自《Head First设计模式》)。这里的重点在于动态这两个字,我们都知道继承的实现的方式,它是是类编译的时候就去加载文件,属于一种静态的附加,而我们要实现动态的附加就不能单纯的通过继承来实现。在这种背景下,装饰者模式就应运而生了。装饰者模式的实现:首先所有的类都有一个共同的抽象,这个抽象可以是一个抽象类,也可以是一个接口,所有的类该抽象的子类或者实现。

主要解决:我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

何时使用:在不想增加很多子类的情况下扩展类。

优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。

缺点:多层装饰比较复杂。

举例:
我们给一个人添加一下他的穿着。

/**
 * 人
 */
public abstract class Person {

    //穿衣服
    public abstract void getDressed();

    //价格
    public abstract double price();
}

张三穿了一个衬衫太少了,我们给他穿一个裤子和鞋子吧,注意这里是动态的添加。

/**
 * 张三
 */
public class Zhangsan extends Person {

    @Override
    public void getDressed() {
        System.out.println("张三穿衬衫");
    }

    @Override
    public double price() {
        //衬衫的价格100
        return 100;
    }
}

创建一个装饰者,它继承一个Person

/**
 * 装饰者
 */
public abstract class Decorator extends Person{

    private Person person = null;

    public Decorator(Person person){
        this.person = person;
    }

    @Override
    public void getDressed() {
        this.person.getDressed();
        this.price();
    }

    @Override
    public double price() {
        return person.price();
    }
}

穿牛仔裤,这里是继承装饰者对象的。

package com.example.maybatissource.decorate;

public class JeansDecorator extends Decorator {

    Person person = null;

    public JeansDecorator(Person person) {
        super(person);
        this.person = person;
    }
    
    // 重写父类的方法
    @Override
    public void getDressed(){
    	// 调用父类的方法
        super.getDressed();
        this.price();
        this.decorateMethod();
    }

    @Override
    public double price() {
        //裤子的价格100
        return person.price()+100;
    }

	 // 定义自己的修饰逻辑
    private void decorateMethod(){
        System.out.println("穿牛仔裤");
    }
}

穿鞋。同样是继承装饰者对象

package com.example.maybatissource.decorate;

/**
 * 穿鞋
 */
public class ShoesDecorator extends Decorator {

    Person person = null;

    public ShoesDecorator(Person person) {
        super(person);
        this.person = person;
    }

    // 重写父类的方法
    @Override
    public void getDressed(){
    	//调用父类的方法
        super.getDressed();
        this.price();
        this.decorateMethod();
    }
    @Override
    public double price() {
        //鞋子的价格100
        return person.price()+100;
    }

    // 定义自己的修饰逻辑
    private void decorateMethod(){
        System.out.println("穿李宁鞋子");
    }
}

main方法

package com.example.maybatissource.decorate;

public class main {
    public static void main(String[] args) {
        Person zhangsan = new Zhangsan();
        // 第一次修饰,穿裤子
        Decorator jeans = new JeansDecorator(zhangsan);
        //将对象进行第二次修饰,当然这里你也可以选择不让他穿鞋子。
        Decorator shoesDecorator = new ShoesDecorator(jeans);
//        jeans.getDressed();
        shoesDecorator.getDressed();
//        System.out.println(jeans.price());
        System.out.println("总价格:"+shoesDecorator.price());
    }
}

动态的为对象赋予它其他的功能(穿牛仔裤,穿鞋)。当然这要注意的是被修饰的对象(Zhangsan)和修饰者对象(Decorator )是都需要继承同一个对象(Person )的,这里为什么要继承同一个对象呢?起到一个约束作用。

可以看下这篇文章为什么要用到装饰者模式:
https://blog.csdn.net/nugongahou110/article/details/50413668

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值