<script type="text/javascript"> var arrBaiduCproConfig=new Array(); arrBaiduCproConfig['uid'] = 50987; arrBaiduCproConfig['n'] = 'lu333cpr'; arrBaiduCproConfig['tm'] = 26; arrBaiduCproConfig['cm'] = 0; arrBaiduCproConfig['um'] = 0; arrBaiduCproConfig['rad'] = 1; arrBaiduCproConfig['w'] = 598; arrBaiduCproConfig['h'] = 90; arrBaiduCproConfig['bd'] = '#FFFFFF'; arrBaiduCproConfig['bg'] = '#FFFFFF'; arrBaiduCproConfig['tt'] = '#555555'; arrBaiduCproConfig['ct'] = '#333333'; arrBaiduCproConfig['url'] = '#666666'; arrBaiduCproConfig['bdl'] = '#FFFFFF'; arrBaiduCproConfig['wn'] = 3; arrBaiduCproConfig['hn'] = 3; arrBaiduCproConfig['ta'] = 'left'; arrBaiduCproConfig['tl'] = 'top'; arrBaiduCproConfig['bu'] = 1; </script><script src="http://cpro.baidu.com/cpro/ui/ui.js" type="text/javascript"> </script><script type="text/javascript">
</script><script type="text/javascript"> var ad_dispnews_content_type = 1; var ad_dispnews_news_class = 11; var ad_dispnews_sec_class = 1103; var ad_dispnews_secname = 'Java教程'; </script><script src="http://www.gzu521.com/recommend/ad_dispnews_content.js" type="text/javascript"> </script> 外观模式(facade pattern)涉及到子系统的一些类。所谓子系统,是为提供一系列相关的特征(功能)而紧密关联的一组类。例如,一个account类、address类和creditcard类相互关联,成为子系统的一部分,提供在线客户的特征。
<script language="JavaScript" src="http://www.gzu521.com/JS/Std_StranJF.Js" type="text/javascript"> </script><script language="JavaScript" src="http://www.gzu521.com/recommend/float1.js" type="text/javascript"> </script>
|
<script type="text/javascript"> var arrBaiduCproConfig=new Array(); arrBaiduCproConfig['uid'] = 50987; arrBaiduCproConfig['n'] = 'lu333cpr'; arrBaiduCproConfig['tm'] = 26; arrBaiduCproConfig['cm'] = 0; arrBaiduCproConfig['um'] = 0; arrBaiduCproConfig['rad'] = 1; arrBaiduCproConfig['w'] = 598; arrBaiduCproConfig['h'] = 90; arrBaiduCproConfig['bd'] = '#FFFFFF'; arrBaiduCproConfig['bg'] = '#FFFFFF'; arrBaiduCproConfig['tt'] = '#555555'; arrBaiduCproConfig['ct'] = '#333333'; arrBaiduCproConfig['url'] = '#666666'; arrBaiduCproConfig['bdl'] = '#FFFFFF'; arrBaiduCproConfig['wn'] = 3; arrBaiduCproConfig['hn'] = 3; arrBaiduCproConfig['ta'] = 'left'; arrBaiduCproConfig['tl'] = 'top'; arrBaiduCproConfig['bu'] = 1; </script><script src="http://cpro.baidu.com/cpro/ui/ui.js" type="text/javascript"> </script><script type="text/javascript">
</script><script type="text/javascript"> var ad_dispnews_content_type = 1; var ad_dispnews_news_class = 11; var ad_dispnews_sec_class = 1103; var ad_dispnews_secname = 'Java教程'; </script><script src="http://www.gzu521.com/recommend/ad_dispnews_content.js" type="text/javascript"> </script>
|
让我们建立一个客户accountmanager,它提供用户输入数据的用户界面。
listing4: client accountmanager class
public class accountmanager extends jframe { |
当客户accountmanage运行的时候,展示的用户接口如下:
<script language="JavaScript" src="http://www.gzu521.com/JS/Std_StranJF.Js" type="text/javascript"> </script><script language="JavaScript" src="http://www.gzu521.com/recommend/float1.js" type="text/javascript"> </script>
<script type="text/javascript"> var arrBaiduCproConfig=new Array(); arrBaiduCproConfig['uid'] = 50987; arrBaiduCproConfig['n'] = 'lu333cpr'; arrBaiduCproConfig['tm'] = 26; arrBaiduCproConfig['cm'] = 0; arrBaiduCproConfig['um'] = 0; arrBaiduCproConfig['rad'] = 1; arrBaiduCproConfig['w'] = 598; arrBaiduCproConfig['h'] = 90; arrBaiduCproConfig['bd'] = '#FFFFFF'; arrBaiduCproConfig['bg'] = '#FFFFFF'; arrBaiduCproConfig['tt'] = '#555555'; arrBaiduCproConfig['ct'] = '#333333'; arrBaiduCproConfig['url'] = '#666666'; arrBaiduCproConfig['bdl'] = '#FFFFFF'; arrBaiduCproConfig['wn'] = 3; arrBaiduCproConfig['hn'] = 3; arrBaiduCproConfig['ta'] = 'left'; arrBaiduCproConfig['tl'] = 'top'; arrBaiduCproConfig['bu'] = 1; </script><script src="http://cpro.baidu.com/cpro/ui/ui.js" type="text/javascript"> </script><script type="text/javascript">
</script><script type="text/javascript"> var ad_dispnews_content_type = 1; var ad_dispnews_news_class = 11; var ad_dispnews_sec_class = 1103; var ad_dispnews_secname = 'Java教程'; </script><script src="http://www.gzu521.com/recommend/ad_dispnews_content.js" type="text/javascript"> </script>
|
为了验证和保存输入的数据,客户accountmanager需要:
(1) 建立account、address和creditcard对象。
(2) 用这些对象验证输入的数据
(3) 用这些对象保存输入的数据。
下面是对象间的交互顺序图:
|
在这个例子中应用外观模式是一个很好的设计,它可以降低客户和子系统组件(address、account和creditcard)之间的耦合度。应用外观模式,让我们定义一个外观类customerfacade (figure6 and listing5)。它为由客户数据处理类(address、account和creditcard)所组成的子系统提供一个高层次的、简单的接口。
customerfacade |
|
listing5: customerfacade class
public class customerfacade { |
customerfacade类以savecustomdata方法的形式提供了业务层次上的服务。客户accountmanager不是直接和子系统的每一个组件交互,而是使用了由customfacade对象提供的验证和保存客户数据的更高层次、更简单的接口(figure7).
<script language="JavaScript" src="http://www.gzu521.com/recommend/ad_dispnews_content_bottom.js" type="text/javascript"> </script><script language="JavaScript" src="http://www.gzu521.com/js/wangzhai.js" type="text/javascript"> </script>
<script type="text/javascript"> var arrBaiduCproConfig=new Array(); arrBaiduCproConfig['uid'] = 50987; arrBaiduCproConfig['n'] = 'lu333cpr'; arrBaiduCproConfig['tm'] = 26; arrBaiduCproConfig['cm'] = 0; arrBaiduCproConfig['um'] = 0; arrBaiduCproConfig['rad'] = 1; arrBaiduCproConfig['w'] = 598; arrBaiduCproConfig['h'] = 90; arrBaiduCproConfig['bd'] = '#FFFFFF'; arrBaiduCproConfig['bg'] = '#FFFFFF'; arrBaiduCproConfig['tt'] = '#555555'; arrBaiduCproConfig['ct'] = '#333333'; arrBaiduCproConfig['url'] = '#666666'; arrBaiduCproConfig['bdl'] = '#FFFFFF'; arrBaiduCproConfig['wn'] = 3; arrBaiduCproConfig['hn'] = 3; arrBaiduCproConfig['ta'] = 'left'; arrBaiduCproConfig['tl'] = 'top'; arrBaiduCproConfig['bu'] = 1; </script><script src="http://cpro.baidu.com/cpro/ui/ui.js" type="text/javascript"> </script><script type="text/javascript">
</script><script type="text/javascript"> var ad_dispnews_content_type = 1; var ad_dispnews_news_class = 11; var ad_dispnews_sec_class = 1103; var ad_dispnews_secname = 'Java教程'; </script><script src="http://www.gzu521.com/recommend/ad_dispnews_content.js" type="text/javascript"> </script>
|
在新的设计中,为了验证和保存客户数据,客户需要:
(1) 建立或获得外观对象customfacade的一个实例。
(2) 传递数据给customfacade实例进行验证和保存。
(3) 调用customfacade实例上的savecustomdata方法。
customfacade处理创建子系统中必要的对象并且调用这些对象上相应的验证、保存客户数据的方法这些细节问题。客户不再需要直接访问任何的子系统中的对象。
figure8展示了新的设计的消息流图:
|
重要提示:
下面是应用外观模式的注意事项:
(1) 在设计外观时,不需要增加额外的功能。
(2) 不要从外观方法中返回子系统中的组件给客户。例如:有一个下面的方法:
creditcard getcreditcard()
会报漏子系统的细节给客户。应用就不能从应用外观模式中取得最大的好处。
(3)应用外观的目的是提供一个高层次的接口。因此,外观方法最适合提供特定的高层次的业务服务,而不是进行底层次的单独的业务执行。>
<script src="http://www.gzu521.com/recommend/google468.js" type="text/javascript"> </script>
<script language="JavaScript" src="http://www.gzu521.com/JS/Std_StranJF.Js" type="text/javascript"> </script><script language="JavaScript" src="http://www.gzu521.com/recommend/float1.js" type="text/javascript"> </script>
<script language="JavaScript" src="http://www.gzu521.com/JS/Std_StranJF.Js" type="text/javascript"> </script><script language="JavaScript" src="http://www.gzu521.com/recommend/float1.js" type="text/javascript"> </script>