23种设计模式-装饰器

定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式比生产子类更灵活
使用场景:需要透明且动态地扩展类的功能时。

/**
 * 主体抽象类
 */
public abstract class Person {
   public abstract void dressed();
}

/**
 * 主体实现类
 */
public class Boy extends Person {
    @Override
    public void dressed() {
        System.out.println("穿了内衣内裤");
    }
}

/**
 * 装饰抽象类
 */
public abstract class PersonCloth extends Person {
    protected Person mPerson;
    public PersonCloth(Person mPerson){
        this.mPerson=mPerson;
    }

    @Override
    public void dressed() {
        mPerson.dressed();
    }
}

/**
 * 装饰实现类1
 */
public class JeanCloth extends PersonCloth {
    public JeanCloth(Person mPerson) {
        super(mPerson);
    }

    void dressJean() {
        System.out.println("穿条牛仔裤");
    }

    @Override
    public void dressed() {
        super.dressed();
        dressJean();
    }
}

/**
 * 装饰实现类2
 */
public class LeatherCloth extends PersonCloth {
    public LeatherCloth(Person mPerson) {
        super(mPerson);
    }
        void dressLeather(){
        System.out.println("穿件皮衣");
    }

    @Override
    public void dressed() {
        super.dressed();
        dressLeather();
    }
}

/**
 * 装饰实现类3
 */
public class ShirtCloth extends PersonCloth {
    public ShirtCloth(Person mPerson) {
        super(mPerson);
    }
    void dressShirt(){
        System.out.println("穿件短袖");
    }

    @Override
    public void dressed() {
        super.dressed();
        dressShirt();
    }
}

/**
 * 使用类
 */
public class Main {
    public static void main(String[] args) {
        Person mPerson = new Boy();
        //穿短袖
        PersonCloth mPersonCloth = new ShirtCloth(mPerson);
        //穿皮衣
        mPersonCloth = new LeatherCloth(mPersonCloth);
        //穿牛仔裤
        mPersonCloth = new JeanCloth(mPersonCloth);
        mPersonCloth.dressed();
    }
}

在使用类Main中我们可以透明动态的为主体Boy添加新功能。

你可能感兴趣的:(23种设计模式-装饰器)