设计模式之适配和装饰

1. 适配器模式

通过一个简单的例子说一下适配器模式,适配器模式属于接口型模式。适配器模式的意图在于,使用不同接口的类所提供的服务为客户端提供。

/**
 * Android规格的充电头
 */
public interface AndroidCharge {
    void isAndroidHeader();
}

/**
 * 苹果手机的插头规格
 */
public interface IphoneCharge {
    void isIphoneHeader();
}

public class AndroidPhone implements AndroidCharge {
    @Override
    public void isAndroidHeader() {
        System.out.println("Andorid充电头");
    }
}
/**
 * 类适配器模式,将你手上的iPhone充电头适配成Android的充电头。
 */
public class Adapter extends AndroidPhone implements  IphoneCharge {
    @Override
    public void isIphoneHeader() {
        isAndroidHeader();
    }
}
/**
 * 对象适配器
 */
public class Adapter2 implements IphoneCharge {

    private AndroidCharge androidCharge;

    public Adapter2(AndroidCharge androidCharge) {
        this.androidCharge = androidCharge;
    }

    @Override
    public void isIphoneHeader() {
        androidCharge.isAndroidHeader();
    }
}
public class Test {

    public static void main(String[] args) {
        IphoneCharge p = new Adapter();
        ((Adapter) p).isAndroidHeader();
    }
}

2. 装饰者模式

装饰者模式: 动态地将责任附加到对象上,对扩展功能来说,装饰者比继承更有弹性更灵活(因为子类继承父类扩展功能的前提,是已知要扩展的功能是什么样的,而这是在编译时就要确定的,但是装饰者模式可以实现动态(在运行时)去扩展功能).

比如有一个可乐对象,那我用一个加冰对象装饰一下,再用加糖对象装饰一下,最后能得到一个加冰加糖可乐,这时候就将原可乐对象扩展,得到了加冰和加糖两种装饰.

public abstract class Drink {

    String name;

    public abstract int price();


    public String getName() {
        return name;
    }
}
public class CocaCola extends Drink{

    public CocaCola() {
        name = "Coca Cola";
    }

    @Override
    public int price() {
        return 30;
    }
}

public class Beer extends Drink {

    public Beer() {
        name="Beer";
    }

    @Override
    public int price() {
        return 6;
    }
}
public abstract class Decorator extends Drink{

    protected Drink drink;

    public Decorator(Drink drink) {
        this.drink = drink;
    }
}
public class VinegarDecorator extends Decorator {

    public VinegarDecorator(Drink drink) {
        super(drink);
    }

    public void addVinegar(){
        System.out.println("加醋");
    }


    @Override
    public int price() {
        return 5+drink.price();
    }


    @Override
    public String getName() {
        return "加醋的"+drink.getName();
    }
}
public class WaterDecorator extends Decorator {

    public WaterDecorator(Drink drink) {
        super(drink);
    }

    public void addWater(){
        System.out.println("饮料兑水");
    }

    @Override
    public int price() {
        return 2+drink.price();
    }

    @Override
    public String getName() {
        addWater();
        return "兑水了的"+drink.getName();
    }
}

public class Test {

    public static void main(String[] args) {
        Drink drink = new CocaCola();
        drink = new WaterDecorator(drink);
        drink = new VinegarDecorator(drink);

        System.out.println(drink.getName()+"---价格:"+drink.price());
    }
}

你可能感兴趣的:(设计模式之适配和装饰)