精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-15
这里先借鉴一下Jdon中关于装饰器模式的一个解释: 装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义
: 为什么使用Decorator
? 使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能. 我觉得其实也就是相当于我们实际生活中的包装的概念。这里来看一个实例,我们知道在使用Hibernate的时候对于创建SessionFactory的话只要一次就够了,这时候我们就可以对SessionFactory进行一个简单的包装来实现这样的目的: package cn.jcenterhome.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Map; import java.util.Properties; import org.hibernate.Session; import org.hibernate.cfg.Configuration; public class SessionFactory { private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static org.hibernate.SessionFactory sessionFactory; public static synchronized void buildSessionFactory() throws SQLException { if (sessionFactory == null) { Map<String, String> jchConfig = JavaCenterHome.jchConfig; String dbHost = jchConfig.get("dbHost"); String dbPort = jchConfig.get("dbPort"); String dbName = jchConfig.get("dbName"); String dbUser = jchConfig.get("dbUser"); String dbPw = jchConfig.get("dbPw"); String dbCharset = jchConfig.get("dbCharset"); if (connect(dbHost, dbPort, dbName, dbUser, dbPw, dbCharset)) { Properties extraProperties = new Properties(); extraProperties.setProperty("hibernate.connection.url", "jdbc:mysql://" + dbHost + ":" + 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; } } 上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。
一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-02-15
平时总说,在一个class上再包一层,总是包啊包,其实,我们已经在使用装饰器这种dp了,只是我们平时可能说的比较口语化,但是思想是相通的。这也就是为什么没有做过实际东西的人,看设计模式没什么感觉的原因了。相见恨晚!
|
|
返回顶楼 | |
发表时间:2011-02-15
最后修改:2011-02-15
tianhandigeng 写道
这里先借鉴一下Jdon中关于装饰器模式的一个解释: 装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义 : 为什么使用Decorator ? 使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能. 我觉得其实也就是相当于我们实际生活中的包装的概念。这里来看一个实例,我们知道在使用Hibernate的时候对于创建SessionFactory的话只要一次就够了,这时候我们就可以对SessionFactory进行一个简单的包装来实现这样的目的: package cn.jcenterhome.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Map; import java.util.Properties; import org.hibernate.Session; import org.hibernate.cfg.Configuration; public class SessionFactory { private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static org.hibernate.SessionFactory sessionFactory; public static synchronized void buildSessionFactory() throws SQLException { if (sessionFactory == null) { Map<String, String> jchConfig = JavaCenterHome.jchConfig; String dbHost = jchConfig.get("dbHost"); String dbPort = jchConfig.get("dbPort"); String dbName = jchConfig.get("dbName"); String dbUser = jchConfig.get("dbUser"); String dbPw = jchConfig.get("dbPw"); String dbCharset = jchConfig.get("dbCharset"); if (connect(dbHost, dbPort, dbName, dbUser, dbPw, dbCharset)) { Properties extraProperties = new Properties(); extraProperties.setProperty("hibernate.connection.url", "jdbc:mysql://" + dbHost + ":" + 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; } } 上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。
一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。
你确定你这个是Decorator模式?而不是别的?颠覆了我以前的思想。
|
|
返回顶楼 | |
发表时间:2011-02-16
peterwei 写道
tianhandigeng 写道
这里先借鉴一下Jdon中关于装饰器模式的一个解释: 装饰模式:Decorator常被翻译成"装饰",我觉得翻译成"油漆工"更形象点,油漆工(decorator)是用来刷油漆的,那么被刷油漆的对象我们称decoratee.这两种实体在Decorator模式中是必须的. Decorator定义 : 为什么使用Decorator ? 使用Decorator的理由是:这些功能需要由用户动态决定加入的方式和时机.Decorator提供了"即插即用"的方法,在运行期间决定何时增加何种功能. 我觉得其实也就是相当于我们实际生活中的包装的概念。这里来看一个实例,我们知道在使用Hibernate的时候对于创建SessionFactory的话只要一次就够了,这时候我们就可以对SessionFactory进行一个简单的包装来实现这样的目的: package cn.jcenterhome.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Map; import java.util.Properties; import org.hibernate.Session; import org.hibernate.cfg.Configuration; public class SessionFactory { private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; private static org.hibernate.SessionFactory sessionFactory; public static synchronized void buildSessionFactory() throws SQLException { if (sessionFactory == null) { Map<String, String> jchConfig = JavaCenterHome.jchConfig; String dbHost = jchConfig.get("dbHost"); String dbPort = jchConfig.get("dbPort"); String dbName = jchConfig.get("dbName"); String dbUser = jchConfig.get("dbUser"); String dbPw = jchConfig.get("dbPw"); String dbCharset = jchConfig.get("dbCharset"); if (connect(dbHost, dbPort, dbName, dbUser, dbPw, dbCharset)) { Properties extraProperties = new Properties(); extraProperties.setProperty("hibernate.connection.url", "jdbc:mysql://" + dbHost + ":" + 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; } } 上面只是一个简单的应用,但是思想就是这样了,我觉得学习设计模式思想很重要,不是说一定要用设计模式来写代码,但是用了设计模式以后确实简单多了。对接口重新包装,对类重新包装,不仅可以重新包装自己写的接口,还可以重新包装我们所有的jar中的接口,目的就一个:使得功能更加完善,更好用。
一句话:以后如果实现功能的拓展我们就可以考虑是否采用用Decorator模式。
你确定你这个是Decorator模式?而不是别的?颠覆了我以前的思想。
你不说,我还真没看内容,好像是外观。。。 |
|
返回顶楼 | |
发表时间:2011-02-17
装饰?
你都已经引用了JDON的解释了,你看一下你的实现是那么回事吗?既然是油漆工,那么肯定只是在被装饰的地方做做表面文章,而不是啥都变了。你这个已经不是油漆工了,而是拆迁工了。 另外,这个也不是Facade,也是打不着边。 |
|
返回顶楼 | |
发表时间:2011-02-17
我感觉很像是代理模式吧 反正往哪个模式上靠都不是很严格 楼主只不过写了工具类 与设计模式一毛钱的关系都没有
要知道设计模式是很严肃性的东西啊 |
|
返回顶楼 | |
发表时间:2011-02-17
加点图就好多了
|
|
返回顶楼 | |
发表时间:2011-02-17
装饰模式 就是wrapper一下吧,LZ的代码就是普通的构造sessionfactory吧
|
|
返回顶楼 | |
发表时间:2011-02-17
decorator就是decorator, 这名字很生动。
lz这个和decorator有啥关系?? |
|
返回顶楼 | |
发表时间:2011-02-17
这类多线程要挂的吧.. synchronized一个方法也没啥用啊.
|
|
返回顶楼 | |