设计模式系列--Facade

一.类图

 

二.意图

为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

三.适用性

a) 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。F a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过F a c a d e 层。

b) 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入Fa c a d e 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。

c) 当你需要构建一个层次结构的子系统时,使用fFa c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过fFa c a d e 进行通讯,从而简化了它们之间的依赖关系。

四.实例

相信在上学的时候都有这样的印象,学习委员在班里高呼:四六级没过的同学赶紧来这里报名了,过期不候。为什么主管报名的老师为什么不直接和学生打交道,而是让每个班级的学习委员负责??这涉及到一个问题,如果老师直接和学生打交道,这套流程太过于复杂,效率也低。所以聪明的老师就弄出学习委员这么一个东西,让他去直接面对学生。学习委员负责下面所有学生的报名,然后老师直接向学习委员要报名单和报名费进行了。通过提取出学习委员这么一层,考试的报名工作减轻了许多。

package explore.facade;

import java.util.ArrayList;
import java.util.List;

public class Student {
private int id;
private String major;

public Student() {

}

public Student(int id, String grade) {
this.id = id;
this.major = grade;
}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getMajor() {
return major;
}

public void setMajor(String major) {
this.major = major;
}

public void signUp() {
System.out.println("报名成功!");
}

public static List<Student> getStudents(int nums, String major) {
List<Student> stus = new ArrayList<Student>();
for (int i = 0; i < nums; i++) {
Student s = new Student(i, major);
stus.add(s);
}
return stus;
}
}

package explore.facade;

import java.util.List;

public class Committor extends Student {
private List<Student> students;

public Committor(List<Student> stus) {
this.students = stus;
}

public List<Student> getStudents() {
return students;
}

public void setStudents(List<Student> students) {
this.students = students;
}

public void signUp() {
for(Student s : students) {
s.signUp();
}
}
}

package explore.facade;

import java.util.List;

public class Teacher {
private List<Committor> cs;

public Teacher(List<Committor> cs) {
this.cs = cs;
}

public List<Committor> getCs() {
return cs;
}

public void setCs(List<Committor> cs) {
this.cs = cs;
}

public void signUp() {
for(Committor c : cs) {
c.signUp();
}
}

}

package explore.facade;

import java.util.ArrayList;
import java.util.List;

public class Client {
public static void main(String[] args) {
List<Student> class1 = Student.getStudents(60, "土木1班");
Committor c1 = new Committor(class1);

List<Student> class2 = Student.getStudents(60, "土木2班");
Committor c2 = new Committor(class2);

List<Student> class3 = Student.getStudents(60, "信管1班");
Committor c3 = new Committor(class3);

List<Committor> cs = new ArrayList<Committor>();
cs.add(c1);
cs.add(c2);
cs.add(c3);
Teacher t = new Teacher(cs);
t.signUp();
}
}

五.Class类中的Facade模式

Class 类的实例表示正在运行的 Java 应用程序中的类和接口。如果我们不了解一个类的内部结构的时候如果获得一个类的Class实例?先想一分钟,如果想不起来请继续向下阅读。我们连接数据库的时候通常会这样写:

 

//注册驱动,把驱动类加载到内存中
Class.forName("driver");

 

好吧,虽然不是一眼能够看出来,但是从功能上分析这确实是运用了Facade模式的思想。





posted @ 2012-03-19 17:06  focusJ  阅读(295)  评论(0编辑  收藏  举报