首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件开发 >

实战学习设计方式之Decorator装饰模式

2012-09-09 
实战学习设计模式之Decorator装饰模式???? 这里先借鉴一下Jdon中关于装饰器模式的一个解释:装饰模式:Decor

实战学习设计模式之Decorator装饰模式

???? 这里先借鉴一下Jdon中关于装饰器模式的一个解释:

装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的.

Decorator定义:
动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.

为什么使用Decorator?
我们通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的.

使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能.

??? 我觉得其实也就是相当于我们实际生活中的包装的概念。这里来看一个实例,我们知道在使用Hibernate的时候对于创建SessionFactory的话只要一次就够了,这时候我们就可以对SessionFactory进行一个简单的包装来实现这样的目的:

?上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。

?

?? 一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。

+ dbPort + "/" + dbName + "?zeroDateTimeBehavior=convertToNull");
extraProperties.setProperty("hibernate.connection.username", dbUser);
extraProperties.setProperty("hibernate.connection.password", dbPw);
extraProperties.setProperty("hibernate.connection.characterEncoding", dbCharset);
extraProperties.setProperty("hibernate.connection.characterSetResults", dbCharset);
Configuration configuration = new Configuration();
configuration = configuration.configure(CONFIG_FILE_LOCATION);
configuration = configuration.addProperties(extraProperties);
sessionFactory = configuration.buildSessionFactory();
}
}
}
public static Session getSession() throws SQLException {
if (sessionFactory == null) {
buildSessionFactory();
}
return sessionFactory.getCurrentSession();
}
public static void rebuildSessionFactory() throws SQLException {
sessionFactory = null;
buildSessionFactory();
}
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}
private static boolean connect(String dbHost, String dbPort, String dbName, String dbUser, String dbPw,
String dbCharset) throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName
+ "?useUnicode=true&characterEncoding=" + dbCharset, dbUser, dbPw);
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
conn = null;
}
return true;
}
return false;
}
}</pre>
<p>?上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。</p>
<p>?</p>
<p>?? 一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。</p>
<p>?</p>
<p><span style="color: #ff0000;">你确定你这个是Decorator模式?而不是别的?颠覆了我以前的思想。</span></p>
</div>
<p>?</p>+ dbPort + "/" + dbName + "?zeroDateTimeBehavior=convertToNull");
extraProperties.setProperty("hibernate.connection.username", dbUser);
extraProperties.setProperty("hibernate.connection.password", dbPw);
extraProperties.setProperty("hibernate.connection.characterEncoding", dbCharset);
extraProperties.setProperty("hibernate.connection.characterSetResults", dbCharset);
Configuration configuration = new Configuration();
configuration = configuration.configure(CONFIG_FILE_LOCATION);
configuration = configuration.addProperties(extraProperties);
sessionFactory = configuration.buildSessionFactory();
}
}
}
public static Session getSession() throws SQLException {
if (sessionFactory == null) {
buildSessionFactory();
}
return sessionFactory.getCurrentSession();
}
public static void rebuildSessionFactory() throws SQLException {
sessionFactory = null;
buildSessionFactory();
}
public static org.hibernate.SessionFactory getSessionFactory() {
return sessionFactory;
}
private static boolean connect(String dbHost, String dbPort, String dbName, String dbUser, String dbPw,
String dbCharset) throws SQLException {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = DriverManager.getConnection("jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName
+ "?useUnicode=true&amp;characterEncoding=" + dbCharset, dbUser, dbPw);
if (conn != null) {
if (!conn.isClosed()) {
conn.close();
conn = null;
}
return true;
}
return false;
}
}</pre>
<p>?上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。</p>
<p>?</p>
<p>?? 一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。</p>
<p>?</p>
<p><span style="color: #ff0000;">你确定你这个是Decorator模式?而不是别的?颠覆了我以前的思想。</span></p>
</div>
<p>?</p>
</div>
<p>?</p>
<p>你不说,我还真没看内容,好像是外观。。。</p> 4 楼 jansel 2011-02-17   装饰?

你都已经引用了JDON的解释了,你看一下你的实现是那么回事吗?既然是油漆工,那么肯定只是在被装饰的地方做做表面文章,而不是啥都变了。你这个已经不是油漆工了,而是拆迁工了。

另外,这个也不是Facade,也是打不着边。 5 楼 zuiyanwangyue 2011-02-17   我感觉很像是代理模式吧 反正往哪个模式上靠都不是很严格 楼主只不过写了工具类 与设计模式一毛钱的关系都没有
要知道设计模式是很严肃性的东西啊 6 楼 pouyang 2011-02-17   加点图就好多了 7 楼 kfc_davy 2011-02-17   装饰模式 就是wrapper一下吧,LZ的代码就是普通的构造sessionfactory吧 8 楼 superwwt 2011-02-17   decorator就是decorator, 这名字很生动。
lz这个和decorator有啥关系??

9 楼 bradwoo8621 2011-02-17   这类多线程要挂的吧.. synchronized一个方法也没啥用啊. 10 楼 Loudyn 2011-02-17   jansel 写道装饰?

你都已经引用了JDON的解释了,你看一下你的实现是那么回事吗?既然是油漆工,那么肯定只是在被装饰的地方做做表面文章,而不是啥都变了。你这个已经不是油漆工了,而是拆迁工了。

另外,这个也不是Facade,也是打不着边。
11 楼 crud0906 2011-02-18   这个不是装饰模式,装饰模式中装饰者与被装饰者要实现同一接口

热点排行