装饰模式
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浅谈装饰模式及其应用
姓名:
班级:
2017年3月30日
摘要:
本文主要简述自己对装束模式的理解以及应用。装饰模式主要包括四个角色,抽象对象类定义对象接口,可以给这些对象动态添加方法;具体对象类定义了具体的对象,实现了抽象对象类中的方法,装饰器可以给它增加额外的方法;抽象装饰类是抽象对象类的子类,用于给具体的对象增加职责,但是具体职责在其子类中实现;具体装饰类是抽象装饰类的子类,负责向对象添加新的方法。装饰模式主要利用继承的方式实现但又比继承更加灵活。
关键词:装饰模式抽象对象类具体对象类抽象装饰类具体装饰件类继承
目录
1 装饰模式定义 (4)
2 装饰模式结构与分析 (4)
2.1 模式结构 (4)
3 实例与解析 (5)
3.1 装饰模式实例之手机功能查询 (5)
3.1.1 实例说明 (5)
3.1.2 实例类图 (5)
3.1.3 实例代码及解释 (5)
3.1.4 辅助代码 (9)
3.1.5运行结果展示 (12)
4 模式优缺点 (15)
5 总结 (16)
1 装饰模式定义
装饰模式是动态的给一个对象增加一些额外的职责,就像是在墙上刷油漆就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式通常通过继承来实现功能的拓展。
2 装饰模式结构与分析
2.1 模式结构
装饰模式结构图
1 抽象对象类
类中定义了对象的接口,可以给这些对象动态的增加方法,抽象对象类是具体对象和抽象装饰类的共同父类,它类有具体对象对象类需要实现的方法。
2 具体对象类
定义了具体的构件对象,实现了在抽象对象类中定义的抽象方法,它也是装饰类装饰的具体对象。
3 抽象装饰类
继承于抽象构件,用于给具体对象增加方法,但是具体的方法是在它
的子类中实现的,抽象装饰类中定义了其子类需要具体实现的方法。
4 具体装饰件类
具体装饰类是抽象装饰类的子类,负责向构件添加新的职责,每一个具体装饰类都有自己具体的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法以便扩充对象的行为。
3 实例与解析
3.1 装饰模式实例之手机功能查询
3.1.1 实例说明
简单的手机在接收到来电耳朵时候,会发出声音提醒,手机功能升级后还可以发出震动,高级手机来电时不仅可以发出声音提醒,震动提醒,还可以灯光闪烁提示。
3.1.2 实例类图
3.1.3 实例代码及解释
(1)抽象对象类Phone
类中定义两个方法一个是抽象方法用来获取手机名称的,一个是用来获取功能
(2)具体对象类SimplePhone
实例化对象简单手机继承phone实现父类中的抽象方法;构造方法用来传参。
(3)具体对象类ComplexPhone
实例化对象高级手机继承phone实现父类中的抽象方法;构造方法用来传参。
(4)抽象装饰类Decorator
抽象装饰类继承phone类,含有抽象方法获取功能。
(5)具体装饰件voice
具体装饰件声音提醒,继承抽象装饰类,构造方法用来传参,定义父类中的两个方法用来给装饰对象附加功能。
(6)具体装饰件shake
具体装饰件震动提醒,继承抽象装饰类,构造方法用来传参,定义父类中的两个方法用来给装饰对象附加功能。
(7)具体装饰件lamp
具体装饰件声音提醒,继承抽象装饰类,构造方法用来传参,定义父类中的两个方法用来给装饰对象附加功能。
3.1.4 辅助代码
(1)框架类
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class MyFrame extends JFrame implements ActionListener{
String s1,s2;
JPanel jp1,jp2;
JComboBox jcb;
JButton jb;
JTextArea ta;
JLabel lb;
public MyFrame(){
//创建对象
jp1=new JPanel();
jp2=new JPanel();
jcb=new JComboBox();
jcb.addItem("简单手机");
jcb.addItem("升级版简单手机");
jcb.addItem("高级手机");
jb=new JButton("查询");
ta=new JTextArea();
lb=new JLabel("手机版本:");
jb.addActionListener(this);
//jcb.addActionListener(this);
//添加面板设置布局
jp1.setLayout(new GridLayout(2,1,10,10));
jp2.setLayout(new GridLayout(1,3,10,100));
jp2.add(lb);
jp2.add(jcb);
jp2.add(jb);
jp1.add(jp2);
jp1.add(ta);
this.setContentPane(jp1);
setTitle("手机功能查询");
setSize(300,300);
setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String value=jcb.getSelectedItem().toString();
Test t1=new Test(value);
}