Java常用GoF设计模式之一装饰者模式

装饰模式使用被装饰类的一个子类的实例,把客户端的调用委派到被装饰类,装饰模式的关键在于这种扩展是完全透明的。

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

装饰模式中的角色有:
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
要点:

装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为

抽象构件类:

package cn.gof.decorate1;
/**
 * @author zhaopan
 * @date 2016年10月25日 上午9:52:00
 * 抽象的被装饰对象
 */
public abstract class Phone {

	public String name;
	
	public String getName() {
		return name;
	}
	
	public abstract void call();
	
	
}
具体构件角色:

package cn.gof.decorate1;
/**
 * @author zhaopan
 * @date 2016年10月25日 上午9:52:00
 * 具体的被装饰对象
 */
public class IPhone extends Phone {

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

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println(name+"打电话");
	}

}
装饰者抽象类:

package cn.gof.decorate1;
/**
 * @author zhaopan
 * @date 2016年10月25日 上午10:01:36
 * 装饰抽象类
 */
public abstract class PhoneFactory extends Phone {

	public abstract void game();
	
}
具体装饰者类:

富士康生产的苹果手机

package cn.gof.decorate1;
/**
 * @author zhaopan
 * @date 2016年10月25日 上午10:03:12
 * 具体装饰类:富士康
 */
public class Foxconn extends PhoneFactory {

	private Phone phone;
	public Foxconn(Phone phone){
		this.phone=phone;
	}

	@Override
	public void game() {
		// TODO Auto-generated method stub
		System.out.print(phone.getName()+"富士康生产的为高通处理器,发热");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println(phone.getName()+"打电话,音质好");
	}

}

OPPO生产的苹果手机

package cn.gof.decorate1;
/**
 * @author zhaopan
 * @date 2016年10月25日 上午10:08:19
 * 具体装饰类:OPPO
 */
public class OPPO extends PhoneFactory {

	private Phone phone;
	public OPPO(Phone phone){
		this.phone=phone;
	}

	@Override
	public void game() {
		// TODO Auto-generated method stub
		System.out.print(phone.getName()+"苹果自己的处理器,快");
	}

	@Override
	public void call() {
		// TODO Auto-generated method stub
		System.out.println(phone.getName()+"打电话,声音大");
	}

}

测试类:

package cn.gof.decorate1;

import java.io.File;
import java.io.FileInputStream;
import java.io.FilterInputStream;
import java.io.InputStream;
import java.io.PushbackInputStream;

/**
 * @author zhaopan
 * @date 2016年10月25日 上午9:11:16
 * 
 */
public class Client {

    public static void main(String[] args) {
    	Phone phone=new IPhone();
    	Foxconn foxconn=new Foxconn(phone);
    	foxconn.game();
    	foxconn.call();
    	
    	OPPO oppo=new OPPO(phone);
    	oppo.game();
    	oppo.call();
    
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值