??xml version="1.0" encoding="utf-8" standalone="yes"?> AOP是一U思想Q或者是Ҏ论,cMOOPQ是OOP的有力补充; 如果非要说谁是谁的实现手D,我更們于AOP主要应用了动态代理,动态代理是AOP的实现手Dc?br />
非常感谢你的阅读Q如果你觉得好或者对你有一定的帮助Q请U极参与评论以示鼓励?/font>
N到?font color="#0000ff">AOP与动态代理有什么联p?/font>”的问题Q现把个Ҏ理如下:
我觉得,动态代理是AOP的主要实现手D之一QAOP是动态代理的一U应用深?
OOP侧重于主要业务功能设计(一般关注点Q;
AOP侧重于横切关注点Q事务、日志、安全等Q诏I于多个模块的功能)
分析:
OOP在横切关注点问题的不xQ?)代码混ؕ 2Q代码分?br />AOP很好的解决了q个问题Qƈ且可以很好的解决“R入问题”?br />
AOP的实玎ͼ必然要求ҎL对象q行代理Q这个地Ҏ疑要用的是动态代理机制?/p>
附记Q?br />记得一个文章提及:
AOP是设计模式的延箋Q?br />GoF侧重于接口、抽象函数来解除耦合Q却对对象的内部无能为力?br />AOP却恰C对象的内部着手,实现调用者和被调用者的分离?br />
常思考之Q甚是!Thanks very much to visit blog, welcome your feedback, your feedback is the Driver && Power to me.
]]>
两者都pd厂模式?br />
本质都是创建具体对象的职责和过E从代码中提取出来,从而实现调用者和被调用者解耦的Q设计模式)目标?br />
但之所以会存在两个分支Q我们可以从其各自的实质来看Q?br />工厂Ҏ模式(Factory Mehod Pattern) 只生一cd象;
抽象工厂模式(Abstract Factory Pattern)产生一pd对象Q这些对象具有如下特征:相关或者相互依?/font>?br />
工厂Ҏ模式可以通过带参数的变种Q即l合j2ee Service Location Pattern方式Q,从而生多U品(即一cd象的多个不同的实例)?br />
抽象工厂模式更注重是相关或者相互依赖的一pd对象Q?font color="#a52a2a">一旦需要改动,只修Ҏ一个具体工厂即可到达修Ҏ个品系列的目的?br />从这一点,如果是涉及一个系列的产品一起工作,我们应该放弃采用(工厂Ҏ模式的)多个工厂Ҏ来达CQ抽象工厂)相同目的的做法?br />因ؓQ?font color="#ffc0cb">如果一个系列的产品一起工作时Q一个应用一ơ只能用同一个品系列中一个对?/font>Q只需要一个具体工厂类Q抽象工厂模式)Q或?多个具体工场c(工厂Ҏ模式Q。如果这一点可以接受,那修改呢Q!
Thanks very much to visit blog, welcome your feedback, your feedback is the Driver && Power to me
private static ServerThread instance = null;
private ServerThread() {
try {
if (socket == null) {
socket = new DatagramSocket(Constants.SERVER_PORT);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static final ServerThread getInstance() {
if (instance == null) {
System.out.println("instance is null new generate
.");
instance = new ServerThread();
}
return instance;
}
public Thread getThreadInstance() {
if (threadInstance == null) {
threadInstance = new Thread(instance);
}
return threadInstance;
}
。。。。。。。?br />
}
main函数有servTr = ServerThread.getInstance().getThreadInstance();一?br />
代码没有问题吧;Z么他的单例每ơ都q入构造函数呢Q?/span>
l问之下才知道了他启动了两次Mainc;启动一?/span>MaincM在一?/span>JVMQ两ơ的单例怎么能是同一个呢Q!
CQ是在同一?/span>JVM中唯一Q不是在一个物理内存中唯一。当然后者不是不能做到的Q分布式对象嘛,呵呵?/span>
W二点就是:单例的构?/span>:
目前方式多种Q我认ؓ只有两种是正的Q?/span>
W一Q?/span>private final static DaoFactory instance = new DaoFactory();
W二Q?/span>
看清楚了Q这里用的是whileQ不?/span>if?/span>
Z么不能用if呢?下面的一个例子说?/span>
private Map map;
private static CategoryFactory instance;
private CategoryFactory() {
map = new HashMap();
generateCategoryTree();
}
public static CategoryFactory getInstance() {
if (null == instance) {
synchronized (CategoryFactory.class) {
if (null == instance) {
instance = new CategoryFactory();
}
}
}
return instance;
}
private void generateCategoryTree() {
。。。。。?br />
}
<一>开q?/p>
大家好,我是crazycyQ今天我们讨论的主题是Design Pattern
首先感谢千年一叹的安排和付出,虽然他极其的忙?/p>
今天的话题可能不很适合初学?对于初学者的可以看我的文?http://m.tkk7.com/crazycy/archive/2006/07/07/57106.html
<?gt; 设计模式的v?/p>
在谈设计模式之前Q我们想一下:Z么会有设计模式?
Christopher Alexander_每一个模式描qC一个在我们周围不断重复发生的问题以及该问题的解x案的核心?/p>
׃大多是做研发的,往往有自q体会Q遇到问?-解决问题Q这个过E中会发现有一些问题及其解x案不断变换面孔重复出玎ͼ其后面的有着共同的本质。实际上q些本质是模式?br />
从哲学角度说Q设计模式的出现是实늻验的l晶Q是产生于实践ƈ指导实践?br />
<?gt;联想
说到q里Q我们现在用的、谈的比较火爆的是Spring Hibernate之类的框架。是吧?
Struts直接革新了Web Model 2的应用?br />
Hibernate直接解决了持久层的非面向对象的尴?br />
Spring直接挑战了原先的Java EE框架?br />
q些都是源于实践。选择一U架构、一U技术的依据是什么? Rod Johnson 认ؓQ应该是Z实践的依据、来自历史项目或亲自试验的经验,而不是Q何Ş式的偶像崇拜或者门户之见?q个是@序方法:实践的反复ȝ。(十的哲学)
Z么说Spring是实늚ȝQ大家可以看一下我的blog的一片文?a href="http://m.tkk7.com/crazycy/archive/2006/06/05/50519.aspx">http://m.tkk7.com/crazycy/archive/2006/06/05/50519.aspx 比较略?/p>
<?gt; 哲学
周爱民先生的《大道至 ?软g工程实践者的思想》对Ҏ、方法论有如下描qͼ
============================================================================================================
3. Ҏ
推动q种逻辑向前发展的,?/span> “ Ҏ ” ?/span> “ Ҏ?/span> ” 的出现。长期的~程实践Q自然的归演与ȝQ必L淀为某U?/span> ( 软g开?/span> ) ҎQ于?/span> “ q程 ” 出现了,于是 “ 对象 ” 出现了,于是相关的方法论也就出现了?/span>
q是实践的成果。方法不是某个h或者某个组l创造的。瓜熟而蒂落,实践U篏辑ֈ一定的E度Q微软不提出某个ҎQ?/span> IBM 也会提出q个Ҏ。即便他们都不提出,可能你自己已l在使用q个Ҏ了?/span>
Ҏq不秘Q因为它是你今天正在做的、从事的和实现的。正?/span> “ 模式 ” 是一U方法,而模式就是你昨天书写代码的那个行为。只不过Q?/span> GoF 归纳、抽取、提升了q些行ؓ的内在规律?/span>
你看不到你做事的行ؓQ也׃能理?/span> “ 模式 ” 作ؓ一U方法的价倹{所以大师们众口一词:模式需要一定的~程l验才能理解?/span>
同理Q理解过E也需要编E经验,理解对象也需要编E经验,理解 MDA ?/span> SOA q是需要编E经验?/span>
—?/span> q可能就发生在你d你上一行代码编写的l过Q或者上一个项目失败的l历的那一瞬息。经验来源于回顾、理解与分析Q而不是你要写的下一行代码?/span>
有h在寺院扫了一辈子的落叶而得道,也有人因Z句话而得道?/span>
GoF 因ؓ无数ơ的代码回顾而得道?/span>
感觉不过瘑֏以看一下我的blog文章Q?br /> http://m.tkk7.com/crazycy/archive/2006/05/24/47799.html
而对于方法论Q查了一下大概阐q如下:Ҏ论是一套完整的实践引导体系Q是指导实践的理论基Q是Z在长期社会实践中ȝ和摸索出来的Q符合客观发展规律的Q符合h们对研究对象q行U学分析与判断的C会实践q程或步骤。方法是实践的成果,如同瓜熟蒂落Q实늧累达C定程度,必然会提出方法?/p>
<?gt;DP产生的必要性和目标
׃大家对OO~程都熟悉,OO的三个基本特征:装、ѝ多态?br />
Ac: q样也就辑ֈ了DP的目标,也正是因个目标的提出Q才诞生了IoC?br />
可以参考的我blog文章Q?a href="http://m.tkk7.com/crazycy/archive/2006/03/19/36068.aspx">http://m.tkk7.com/crazycy/archive/2006/03/19/36068.aspx 可参考我的blog文章Q?a href="http://m.tkk7.com/crazycy/archive/2006/04/30/44169.html">http://m.tkk7.com/crazycy/archive/2006/04/30/44169.html 大家都用qStruts吧?
OO解决不了的问?-JavaZ子:
java语言要求一个类实例化时Q必调用这个类的具体类的构造子Q所以java语言l出的类的实例化Ҏ无法做到只依赖抽象类型?br />
q造成了调用者合被调用者的一U紧耦合
设计模式q求的目标是调用者和被调用者之间的解耦?/font>
CZQ?br />
消费一个对象的客户端只依赖于对象的抽象cdQ而不是具体类?/p>
State state = new StartState();
工厂c:
public class StateFactory {
public State static createState() {
State state = new. StartState();
return state;
}
}
Ac:
State state = StateFactory.createState();
q样很Ҏ理解工厂cd是生产对象,也就是创建对象,把对象的创徏q程从类A中摘取出?
q里有朋友问抽象工厂和工厂方法两个模式的区别Q?br />
可以参考我的blog文章Q?a href="http://m.tkk7.com/crazycy/archive/2006/10/08/73858.html">http://m.tkk7.com/crazycy/archive/2006/10/08/73858.html
<?gt;介绍几个模式
Decorator模式?br />
1. 对真实对象进行包?
2. 使其功能扩展
3. 表现形式Qnew 包装c?Qnew 包装c?(真实对象)Q;q样真实对象具备了本n、包装类1、包装类2的功能;
4. 实现时只需要把真实对象做ؓ包装cȝ聚合对象Q?
实在不行想想MLӞ如果带上TT后,原来的不影响Q而且q安全了。主要就是包装原先的对象?/p>
Dynamic Proxy模式?br />
代理模式QProxyQ这里侧重于Dynamic ProxyQ可以理解成l一个对象提供一个代理对象,q个代理对象是把原对象q行包装Q其与调用处理器相兌?br />
因ؓ代理对象和真实对象具有相同的接口Q客戯问时Q通过接口调用代理实例的方法,q个调用会被分发到该实例对应的处理器。处理器在把客户端调用传递给真实的对象之前或者之后,可执行某个操作,也可以选择不把q个调用传递给真实的对象?br />
1. 真实对象包?
2. 使其与调用处理类l定
3. 表现形式QProxy.newProxyInstance(realObject.getClass(). getClassLoader(), realObject.getClass().getInterfaces(), new InvocationHandler(realObj))Q这L实对象就与InvocationHandlerc邦定了Q对外是一个代理类的Ş式;
4. 实现时只需要把真实对象做ؓ调用处理器的聚合对象
实在不行想惻I垂帘听政Q犹如清朝康熙年间的四大府臣Q很多权利不在皇帝手里,必须通过辅佐大臣dQ?br />
具体CZ参加blogQ?br />
http://m.tkk7.com/crazycy/archive/2006/04/29/44006.html
Command模式
本质Q将调用操作的对??知道如何实现Ҏ作的对象 解耦?br />
1 调用?br />
发出h的对象,h被包装成h对象的Ş式(侧重于对象)
2 接收?br />
知道如何处理某个h的对象?br />
3 兌?br />
具备调用者传入的h对象Q?br />
q且l定接收者?/p>
或许Struts的Action是一个很好的说明CZQ?br />
Public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res)
Ҏ的action是兌?br />
Ҏ的req可以理解成请求?br />
Ҏ的form 是h对象
Ҏ的mapping是接收?/p>
]]>
1
调用?/span>
发出h 的对象,h被包装成h对象的Ş式(重点是封装成了请求对象)
2
接收?/span>
是 ?
知道如何处理某个h 的对象?/span>
3
兌?/span>
或许
Struts
的Action是一个很好的说明CZQ?/span>
Ҏ的req可以理解成请求?br />
Ҏ的form
是h对象
Ҏ的mapping
是接收?/span>
而最初在接触观察者模式前Q我p了大?天左右的旉Q一直在考虑Java提供的事件机Ӟ其是GUI斚w的用,因ؓ对GUI可以说是我的一个盲点,因此试从思想上有所截获。最l我归纳如下Q?/span>
1.
监听者注册即调用旉源的注册ҎQƈ以监听者接口ؓ参数Q?/span>
2.
事g源通知卌用监听者方法传递消息;
3.
通知的消息可以是一个事件对象;
4.
通知的方式就是监听者接口的ҎQ且以事件对象ؓ参数?/span>
Dynamic Proxy模式?/p>
==============以下是引用,2007q?5?1日增?==============
首先我们来明一下动态代理的定义Q?font color=#000080>一个动态代理类在运行期implements一linterfaceQ得interface实现cȝҎ调用被分z至其他的类(另外的interface实现cL者Q意的c?的方?/font>。讲得更通俗一些,要了解动态代理,我们p知道什么东西动态了Q代理了什么?首先Q一个Proxy代理了一linterface的方法。注意,代理的是interfaceQ而不是ClassQ也不是abstract ClassQ其ơ,Proxyh的型别由l定的interface所军_?/font>Q动态就体现在此。也许看着q样的定义,q是会一头雾_那么我们d图来看看吧?
从图中,我们可以看到Dynamic Proxyq没有实现Resourceq个接口Q但是包含了Resource接口实现cȝ实例Q在Dynamic Proxy的createҎ中,通过调用Proxy.newProxyInstance创徏一个ProxyQƈ该Proxy与Resource接口l定Q最后将Proxy昑ּcd转换成Resource接口cdq返回,q样调用者就可以通过Proxy调用interface定义的方法了Q由于Proxy与Resource接口l定了,对Resource接口的方法调用,都会交由Proxy的invokeҎd理。而invokeҎ会根据不同的ҎQ或l以全新的实玎ͼ或直接将Ҏ调用交给Proxy中包含的Resource接口实现cȝ实例d理。综合上面所说的Q作Z个Dynamic ProxyQ它必须满以下三个条gQ?
1、实CInvocationHandler接口Q实现接口中定义的invokeҎQ?
2、包含接口实现类的实例;
3、通过Proxy.newProxyInstanceҎ实现Proxy与接口之间的l定?
以下代码l出了一个简单的Dynamic Proxy实现Q?
public interface BusinessInterface { public void processBusiness(); } public class BusinessObject implements BusinessInterface { private Logger logger = Logger.getLogger(this.getClass().getName()); public void processBusiness(){ try { logger.info("start to processing..."); //business logic here. System.out.println(“here is business logic”); logger.info("end processing..."); } catch (Exception e){ logger.info("exception happends..."); //exception handling } } } |
public class LogHandler implements InvocationHandler { private Logger logger Q?Logger.getLogger(this.getClass().getName()); private Object delegate; public LogHandler(Object delegate){ this.delegate = delegate; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object o = null; try { logger.info("method stats..." Q?method); o = method.invoke(delegate,args); logger.info("method ends..." + method); } catch (Exception e){ logger.info("Exception happends..."); //excetpion handling. } return o; } } |
public class BusinessObject implements BusinessInterface { private Logger logger = Logger.getLogger(this.getClass().getName()); public void processBusiness(){ //business processing System.out.println(“here is business logic”); } } |
BusinessInterface businessImp = new BusinessObject(); InvocationHandler handler = new LogHandler(businessImp); BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance( businessImp.getClass().getClassLoader(), businessImp.getClass().getInterfaces(), handler); proxy.processBusiness(); |
INFO: method stats... here is business logic INFO: method ends... |