转载请注明出处:http://blog.csdn.net/droyon/article/details/8744778
外观模式:提供一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易的使用。
外观模式的作用是简化接口,将客户端从组件中解耦。适配器模式也处理接口,不过是转化接口。
外观模式让我们的客户和子系统之间避免紧耦合。
森林要召开音乐会,所有的动物都要参加。开幕式所有动物都要参与唱歌。每个动物唱歌的方法不一样,比如,小花猫唱歌的方法为quack,小狗唱歌的方法为bake,小鸟的唱歌方法为sing,而且音乐会结束,要通知每个动物音乐会结束了。
主办方难道真的要一个动物一个动物的调用他们唱歌的方法吗,而且在音乐会结束时,要一个一个的通知音乐会结束吗?看看外观模式怎么帮助他们。
案例代码下载
1.Cat.java
public class Cat {
public void quack(){
System.out.println("猫:"+"喵");
}
public void goHome(){
System.out.println("猫:"+"音乐会结束,回家捉老鼠去了");
}
}
2.Dog.java
public class Dog {
public void bake(){
System.out.println("狗:"+"汪汪");
}
public void homeToGurd(){
System.out.println("狗:"+"回到主人身边,看家护院");
}
}
3.Bird.java
public class Bird {
public void sing(){
System.out.println("小鸟:"+"啊啊啊啊~");
}
public void musicIsOver(){
System.out.println("小鸟:"+"音乐会结束,回家找妈妈");
}
}
4.Sheep.java
public class Sheep {
public void shout(){
System.out.println("绵羊:"+"咩咩");
}
public void over(){
System.out.println("绵羊:"+"音乐会结束,吃草去");
}
}
5.AllthiingToMe.java
public class AllthingTakeToMe {
private Cat mCat;
private Dog mDog;
private Sheep mSheep;
private Bird mBird;
public AllthingTakeToMe(Cat cat,Dog dog,Sheep sheep,Bird bird){
mCat = cat;
mDog = dog;
mSheep = sheep;
mBird = bird;
}
public void allSing(){
mCat.quack();
mDog.bake();
mSheep.shout();
mBird.sing();
}
public void over(){
mCat.goHome();
mDog.homeToGurd();
mSheep.over();
mBird.musicIsOver();
}
}
6.Test.java
public class Test {
public static void main(String args[]){
Cat cat = new Cat();
Dog dog = new Dog();
Sheep sheep = new Sheep();
Bird bird = new Bird();
AllthingTakeToMe thingsToMe = new AllthingTakeToMe(cat, dog, sheep, bird);
System.out.println("音乐会开始,全体,预备唱~~~");
thingsToMe.allSing();
System.out.println("--------------------");
System.out.println("音乐会,结束,大家各回各家~");
thingsToMe.over();
}
}
测试结果:
音乐会开始,全体,预备唱~~~
猫:喵
狗:汪汪
绵羊:咩咩
小鸟:啊啊啊啊~
--------------------
音乐会,结束,大家各回各家~
猫:音乐会结束,回家捉老鼠去了
狗:回到主人身边,看家护院
绵羊:音乐会结束,吃草去
小鸟:音乐会结束,回家找妈妈
总结:
这个模式体现了一个原则:最少知识原则:只和你的密友谈话。不要让太多的类耦合在一起,避免修改系统的一部分,影响到其他部分。我们应该多封装方法,减少对象的引入,避免依赖太多的对象。
当需要简化并统一很大的接口或者一群复杂的接口时,使用外观模式。外观模式可以让客户从一个复杂的子系统中解耦。