我们家里需要装潢,例如墙上要粉刷或者贴墙纸,不论怎么装饰墙还是墙,只是在原有的基础上多了些美观性。这里我们要讲述的装饰模式类似于刷墙贴墙纸,这里来装饰我们的方法,
让我们原有的方法的功能增加或者减少而不影响原来的方法,类似于墙他还是墙功能没有改变.
装饰模式里有四个要素
1.抽象构建角色:定义一个接口,规范对象
2具体构建角色:实现抽象构件角色的接口
3.抽象装饰角色:持有一个构建角色的实例,并规范抽象角色的接口
4.具体装饰角色:给构件装饰添加删除方法
这里我们用一个普通门和一个具有锁的门来做检验
定义一个门
/**
*
*/
package com.model.decorate;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:IDoor
* 日期:2012-9-8 上午09:08:40
* 作者:
* 模块:
* 描述:
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public interface IDoor {
public boolean open();
public boolean close();
public boolean lock();
public boolean unLock();
public boolean getLockFlag();
}
实现一个普通的门
/**
*
*/
package com.model.decorate;
/**
***************************************************************
* 项目名称:DescignModel 程序名称:DoorImpl 日期:2012-9-8 上午09:10:24
* 作者模块:
* 描述: 一个普通的门没有锁
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号
* 日期
* 修改人
* 修改原因
*
* 修改备注:
*
* @version
***************************************************************
*/
public class DoorImpl implements IDoor {
// 是否锁上了
public boolean flag = false;
/*
* (non-Javadoc)
*
* @see com.model.decorate.IDoor#open()
*/
@Override
public boolean open() {
System.out.println("门成功打开");
return true;
}
/*
* (non-Javadoc)
*
* @see com.model.decorate.IDoor#close()
*/
@Override
public boolean close() {
System.out.println("门关上了");
// 锁上
lock();
return true;
}
/*
* (non-Javadoc)
*
* @see com.model.decorate.IDoor#lock()
*/
@Override
public boolean lock() {
this.flag = true;
return true;
}
@Override
public boolean unLock() {
this.flag = false;
return false;
}
public boolean isFlag() {
return flag;
}
@Override
public boolean getLockFlag() {
return this.flag;
}
}
定义一个装饰门
/**
*
*/
package com.model.decorate;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:AlarmDoor
* 日期:2012-9-8 上午09:17:49
* 作者:
* 模块:
* 描述:
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public class AlarmDoor implements IDoor {
public IDoor door;
public AlarmDoor(IDoor door){
this.door = door;
}
/* (non-Javadoc)
* @see com.model.decorate.IDoor#open()
*/
@Override
public boolean open() {
return door.open();
}
/* (non-Javadoc)
* @see com.model.decorate.IDoor#close()
*/
@Override
public boolean close() {
return door.close();
}
/* (non-Javadoc)
* @see com.model.decorate.IDoor#lock()
*/
@Override
public boolean lock() {
return door.lock();
}
/* (non-Javadoc)
* @see com.model.decorate.IDoor#unLock()
*/
@Override
public boolean unLock() {
return door.unLock();
}
@Override
public boolean getLockFlag() {
return door.getLockFlag();
}
}
实现这个装饰过的门
/**
*
*/
package com.model.decorate;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:AlarmDoorDecorate
* 日期:2012-9-8 上午09:20:18
* 作者:
* 模块:
* 描述:
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public class AlarmDoorDecorate extends AlarmDoor {
public AlarmDoorDecorate(IDoor door) {
super(door);
// TODO Auto-generated constructor stub
}
//开始装饰
public boolean open(){
if(IsLock()){
System.out.println("警告:请开锁!");
return false;
}
return super.open();
}
public boolean IsLock(){
return super.getLockFlag();
}
}
我们来测试一下
/**
*
*/
package com.model.decorate;
/**
***************************************************************
* 项目名称:DescignModel
* 程序名称:Test
* 日期:2012-9-8 上午09:29:12
* 作者:
* 模块:
* 描述:
* 备注:
* ------------------------------------------------------------
* 修改历史
* 序号 日期 修改人 修改原因
*
* 修改备注:
* @version
***************************************************************
*/
public class Test {
/**
* 方法名:main
* 描述:
* 作者:
* 日期:2012-9-8 上午09:29:12
* @param @param args
* @return void
*/
public static void main(String[] args) {
IDoor door = new DoorImpl();
door.lock();
door.open();
IDoor alarmDoor = new AlarmDoorDecorate(door);
alarmDoor.open();
}
}
运行结果
门成功打开
警告:请开锁!
我们可以看出来普通的门没有警告是否可以开锁。
装饰过后门还是门,多了锁的功能。
装饰模式一般用在
1.透明,动态的修改对象,而不影响其他对象
2.屏蔽某些对象的功能
透明在面向接口的变成中的意思是客户程序只对接口进行操作而无需知道具体类型。