设计模式实例分析_软件体系结构

1. 研究生毕业时需要办理毕业证、学位证和派遣证,毕业证由学校教务处颁发,学位证由研究生院颁发,派遣证由学校派出所颁发,每个证件均需要毕业生一寸照片。模拟开发一个毕业生毕业手续办理程序,要求:(1)由专门的机构代理办理各种毕业手续;(2)各个制证机构所要求的照片稍有不同,需要不同的装饰,毕业证的照片需要一个花边;学位证的照片底部需要打印上学位证号码;派遣证的照片底部需要打印派遣机构名称。


从适配器模式、代理模式、外观模式和装饰者模式中选择合适的模式完成上述案例开发,达到模拟演示效果即可。

解答:

 装饰模式  

View Code
1 /**
2 */
3  /**
4 * @author chenx
5 *
6 */
7  public abstract class Certificate {
8 public abstract void printCertificate();
9 }
10
11
12  /**
13 */
14  /**
15 * @author chenx
16 *
17 */
18  public abstract class CertificateDecorator extends Certificate {
19
20 /* (non-Javadoc)
21 * @see Certificate#printCertificate()
22 */
23 protected Certificate certificate;
24
25 public CertificateDecorator(Certificate certificate){
26
27 this.certificate = certificate;
28 }
29
30 @Override
31 public abstract void printCertificate();
32 }
33
34  /**
35 */
36 /**
37 * @author chenx
38 *
39 */
40 public class ConcreteCertificate extends Certificate {
41
42 /* (non-Javadoc)
43 * @see Certificate#printCertificate()
44 */
45 @Override
46 public void printCertificate() {
47 // TODO Auto-generated method stub
48 System.out.println("Certificate : Personal Picture");
49 }
50
51 }
52
53 /**
54 */
55 /**
56 * @author chenx
57 *
58 */
59 public class DegreeCertificate extends CertificateDecorator {
60
61 /**
62 * @param certificate
63 */
64 public DegreeCertificate(Certificate certificate) {
65 super(certificate);
66 // TODO Auto-generated constructor stub
67 }
68
69 /* (non-Javadoc)
70 * @see CertificateDecorator#printCertificate()
71 */
72 @Override
73 public void printCertificate() {
74 // TODO Auto-generated method stub
75 System.out.println("Degree Certificate : Add Degree No. to the Picture ");
76 certificate.printCertificate();
77 }
78
79 }
80
81
82 /**
83 */
84 /**
85 * @author chenx
86 *测试程序
87 */
88 public class Test {
89
90 public static void main(String[] args){
91 //毕业证
92 CertificateDecorator certificateDecorator = new GraduateCertificate(new ConcreteCertificate());
93 certificateDecorator.printCertificate();
94
95 //学位证
96 certificateDecorator = new DegreeCertificate(new ConcreteCertificate());
97 certificateDecorator.printCertificate();
98
99 //派遣证
100 certificateDecorator = new DispatchCertificate(new ConcreteCertificate());
101 certificateDecorator.printCertificate();
102
103 }
104 }

2. 软件体系结构实验课要求所有选课同学和课程旁听的同学按特定模板(模板中包括学生姓名、实验内容和实验结论)提交实验报告,模拟编写一个实验报告生成程序。(1)按照预定的模板生成实验报告;(2)为了管理方便,   任课老师对模板进行了简单修改,   在模板上添加了学生学号,   并通知所有选课学生和旁听课程的学生按照新的模板撰写实验报告。

从中介者模式、观察者模式、状态模式、策略模式、模板模式和访问者模式中选择合适的模式完成上述案例开发,达到模拟演示效果即可。

观察者模式

View Code
1 import java.util.ArrayList;
2 import java.util.Iterator;
3 import java.util.List;
4
5 /**
6 */
7 /**
8 * @author chenx
9 * 对主题的抽象,具体的主题将继承这个抽象的主题
10 */
11 public abstract class Subject {
12
13 private List<Observer> observers = new ArrayList<Observer>();
14
15 public void RegisterObserver(Observer observer) {
16 observers.add(observer);
17 }
18
19 public void DeleteObserver(Observer observer) {
20 observers.remove(observer);
21
22 }
23
24 public void Notify(){
25 for(Iterator<Observer> interator = observers.iterator();interator.hasNext();){
26 Observer observer =(Observer) interator.next();
27 observer.update();
28 }
29 }
30 }
31
32
33
34 /**
35 */
36 /**
37 * @author chenx
38 * 抽象的观察者
39 */
40 public abstract class Observer {
41 //更新状态
42 public abstract void update();
43
44 //展示自己知道的情况
45 public abstract void showState();
46
47 }
48
49 /**
50 */
51 /**
52 * @author chenx
53 *具体的观察者:学生
54 */
55 public class Student extends Observer {
56
57 /* (non-Javadoc)
58 * @see Observer#update()
59 */
60
61 private String report; //当前他知道的报告情况
62
63 private Teacher teacher;//谁负责通知学生
64
65 public Student(Teacher teacher){
66
67 this.teacher = teacher;
68
69 }
70
71 @Override
72 public void update() {
73 // TODO Auto-generated method stub
74 report = teacher.getReport();
75 }
76
77 /* (non-Javadoc)
78 * @see Observer#showState()
79 */
80 @Override
81 public void showState() {
82 // TODO Auto-generated method stub
83 System.out.println("I have observed that the teacher's instructions about the report:--->" + report);
84 }
85
86 }
87
88 /**
89 */
90 /**
91 * @author chenx
92 * 具体的通知者:老师
93 */
94 public class Teacher extends Subject {
95 //报告的具体情况
96 private String report;
97
98 /**
99 * @return the report
100 */
101 public String getReport() {
102 return report;
103 }
104
105 /**
106 * @param report the report to set
107 */
108 public void setReport(String report) {
109 this.report = report;
110 }
111
112
113 }
114
115
116 /**
117 */
118 /**
119 * @author chenx
120 *测试程序
121 */
122 public class Test {
123 public static void main(String[] args){
124 Teacher tang = new Teacher(); //定义老师Tang
125
126 //定义两个学生Chenx 和 Wanglq
127 Student chenx= new Student(tang);
128 Student wanglq = new Student(tang);
129
130 //每个学生都在Teacher tang这儿注册
131 tang.RegisterObserver(chenx);
132 tang.RegisterObserver(wanglq);
133
134 tang.setReport("Changes to the report,Student No. Needed in the report!");
135 tang.Notify();
136
137 chenx.showState();
138 wanglq.showState();
139
140
141 }
142 }

3.计算机由主机和显示器两个部分组成,模拟开发一个计算机组装程序,要求:(1)用户组装计算机时,           可选择高档、中档和低档三种类型,           每个档次的计算机均有固定的标准配置(固定型号的主机和固定型号的显示器)           系统应按照每个档次的标准配置自动完成计算机组装;(2)涌现出多家生产计算机显示器的厂家,            出现了不同品牌的显示器(比如戴尔品牌和三星品牌),            每个显示器生产厂家均针对高中低档计算机推出了固定型号的显示器,            用户安装计算机时可选择显示器品牌,并根据选定的档次和品牌自动完成计算机组装。

从工厂模式、抽象工厂模式和建造者模式中选择合适的模式完成上述案例开发,达到模拟演示效果即可。

建造者模式

View Code

posted on 2011-06-05 19:34  追求卓越 挑战极限  阅读(1362)  评论(1编辑  收藏  举报

导航