vate TheaterLight() {
}
public void on(){
System.out.println("打开灯光");
}
public void off(){
System.out.println("关闭灯光");
}
public void dim(){
on();//先打开再调暗
System.out.println("调暗灯光");
}
public void bright(){
System.out.println("调量灯光");
}
}
/**
* @author 长名06
* @version 1.0
* dvd播放器
*/
public class DVDPlayer {
private static DVDPlayer dvdPlayer = new DVDPlayer();
public static DVDPlayer getDvdPlayer(){
return dvdPlayer;
}
private DVDPlayer(){
}
public void on(){
System.out.println(" dvd播放器 打开");
}
public void off(){
System.out.println(" dvd播放器 关闭");
}
public void pause(){
System.out.println(" dvd播放器 暂停");
}
public void play(){
System.out.println(" dvd播放器 播放");
}
}
//调用者
public class Client {
public static void main(String[] args) {
HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
homeTheaterFacade.ready();
System.out.println("--------");
homeTheaterFacade.play();
System.out.println("--------");
homeTheaterFacade.pause();
System.out.println("--------");
homeTheaterFacade.end();
}
}
外观模式在Mybatis框架的源码分析
//org.apache.ibatis.session.Configuration类的方法
public MetaObject newMetaObject(Object object) {
return MetaObject.forObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}
//MetaObject的forObject方法
public static MetaObject forObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
if (object == null) {
return SystemMetaObject.NULL_META_OBJECT;
} else {
return new MetaObject(object, objectFactory, objectWrapperFactory, reflectorFactory);
}
}
//会调用到MetaObject类中的该方法
private MetaObject(Object object, ObjectFactory objectFactory, ObjectWrapperFactory objectWrapperFactory, ReflectorFactory reflectorFactory) {
this.originalObject = object;
this.objectFactory = objectFactory;
this.objectWrapperFactory = objectWrapperFactory;
this.reflectorFactory = reflectorFactory;
if (object instanceof ObjectWrapper) {
this.objectWrapper = (ObjectWrapper) object;
} else if (objectWrapperFactory.hasWrapperFor(object)) {
this.objectWrapper = objectWrapperFactory.getWrapperFor(this, object);
} else if (object instanceof Map) {
this.objectWrapper = new MapWrapper(this, (Map) object);
} else if (object instanceof Collection) {
this.objectWrapper = new CollectionWrapper(this, (Collection) object);
} else {
this.objectWrapper = new BeanWrapper(this, object);
}
}
外观模式的注意事项和细节
- 1.外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性。
- 2.外观模式对客户端和子系统的耦合关系-解耦,让子系统内部的模块更易于维护和扩展。
- 3.通过合理的使用外观模式,可以帮我们更好的划分访问的层次。
- 4.当系统需要进行分层设计时,可以考虑外观模式。
- 5.在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade类,来提供遗留系统的比较清晰简单的接口,让新系统和Facade类交互,提高复用性。
- 6.不能过多的或者不合理的使用外观模式,要以让系统有层次,利于维护为目的,考虑是使用外观模式好,还是直接调用模块好。
只是为了记录自己的学习历程,且本人水平有限,不对之处,请指正。