今天学装饰者模式(decorrator), 使用同一接口的几个子类相互修饰. 或者说一个子类做核(我把它叫做核子类),另一个子类给它套壳(壳子类),用来组合两个子类的行为,不同的核与壳组合能产生(核数*壳数)种新对象.由于java是单继承,如果直接用继承来做这事得重复产生太多的3级子类.


下面是代码

package com.a;
class Test4{
    public static void main(String args []){
        Plumber pb = new Plumber(); //做一个核
        Acoworker _john = new Acoworker(pb); //套一个壳
        Carpenter ct = new Carpenter(); //做一个核
        Acoworker _lisa = new Acoworker(ct); //套一个壳
        _john.doWork(); //最终行为
        _lisa.doWork();
    }
}
interface Worker{
    public void doWork(); //注意接口的方法只能是public且不能接{},即使是空的{}也不行
}
class Plumber implements Worker{ //这是一个核子类
    public void doWork(){ //这行我原先写的没有public,以为同包用default权限也能访问,后来发现子类继承父类的时候权限不能缩小只能扩大或相同
        System.out.println("修水管 fix plumb");
    }
}
class Carpenter implements Worker{ //同样也是一个核子类
    public void doWork(){ //同上面,原先也是用default权限
        System.out.println("做门窗 fix windows");
    }
}
class Acoworker implements Worker{ //这是一个壳子类,装饰者
    private Worker wk;
    Acoworker(Worker worker){
        this.wk = worker;
    }
    public void doWork(){ //同上面
        System.out.println("你好!");
        wk.doWork();
    }
}

复习到两件事:


1.同包权限default访问不适用于interface类,interface类的所有方法都必须public;


2.子类继承父类时重写方法的权限不能小于原方法.