今天学装饰者模式(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.子类继承父类时重写方法的权限不能小于原方法.