装饰者模式是指在不改变原有的对象的基础上,将功能附加到对象上,提供了比继承更有弹性的解决方案,属于结构模型
装饰者模式适用于以下场景
1.扩展一个类的功能或给一个类添加附加职责
2.动态的给对象添加功能,这些功能可以动态的撤销
下面进行举例
创建基础类
public class Member {
private String username;
private String password;
private String mid;
private String info;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMid() {
return mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
public class ResultMsg {
private int code;
private String msg;
private Object data;
public ResultMsg(int code, String msg, Object data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
创建Service接口
public interface ISigninService {
ResultMsg regist(String username,String password);
/**
* 登录方法
* @param username
* @param password
* @return
*/
ResultMsg login(String username,String password);
}
对Service接口进行实现
public class SinginService implements ISigninService {
@Override
public ResultMsg regist(String username, String password) {
// TODO Auto-generated method stub
return null;
}
@Override
public ResultMsg login(String username, String password) {
// TODO Auto-generated method stub
return null;
}
}
创建接口继承原接口
public interface ISigninForThirdService extends ISigninService {
//扩展接口
}
然后创建实现类对扩展接口进行实现这就是装饰者模式
和适配器模式相比
适配器模式,一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中。
装饰器模式,原有的不能满足现有的需求,对原有的进行增强。
装饰者模式的优缺点
装饰者模式的优点
1.装饰者模式是对继承的有力补充,且比继承灵活,可以在不改变原有对象的情况下动态的给一个对象扩展功能
2.使用不同的装饰类及这些装饰类的排列组合,可以呈现不同的效果
3.装饰者模式完全符合开闭原则
装饰者模式的缺点
1.会出现更多的代码更多的类,增加程序的复杂性
2.动态装饰时,多层装饰会更复杂