Observer(观察者)模式是比较常用的一个模式 尤其在界面设计中应用广泛 而本站所关注的是Java 在电子商务系统中应用 因此想从电子商务实例中分析Observer 的应用
虽然网上商店形式多样 每个站点有自己的特色 但也有其一般的共性 单就 商品的变化 以便及时通知订户 这一点 是很多网上商店共有的模式 这一模式类似Observer patern
具体的说 如果网上商店中商品在名称 价格等方面有变化 如果系统能自动通知会员 将是网上商店区别传统商店的一大特色 这就需要在商品product 中加入Observer 这样角色 以便product 细节发生变化时 Observer 能自动观察到这种变化 并能进行及时的update 或notify 动作
Java 的API 还为为我们提供现成的Observer 接口Java util Observer 我们只要直接使用它就可以
我们必须extends Java util Observer 才能真正使用它:
提供Add/Delete observer 的方法
提供通知(notisfy) 所有observer 的方法
//产品类 可供Jsp 直接使用UseBean 调用 该类主要执行产品数据库插
入 更新
public class product extends Observable{
private String name
private float price
public String getName(){
return name
}
public void setName(){
this name=name
//设置变化点
setChanged()
notifyObservers(name)
}
public float getPrice(){
return price
}
public void setPrice(){
this price=price
//设置变化点
setChanged()
notifyObservers(new Float(price))
}
//以下可以是数据库更新 插入命令
public void saveToDb(){
}
我们注意到 在product 类中 的setXXX 方法中 我们设置了 notify(通知)方法 当Jsp 表单调用setXXX(如何调用见我的另外一篇文章) 实际上就触发了notisfyObservers 方法 这将通知相应观察者应该采取行动了
下面看看这些观察者的代码 他们究竟采取了什么行动:
//观察者NameObserver 主要用来对产品名称(name)进行观察的
public class NameObserver implements Observer{
private String name=null
public void update(Observable obj Object arg){
if (arg instanceof String){
name=(String)arg
//产品名称改变值在name 中
System out println( NameObserver :name changet to +name)
}
}
}
//观察者PriceObserver 主要用来对产品价格(price)进行观察的
public class PriceObserver implements Observer{
private float price=
public void update(Observable obj Object arg){
if (arg instanceof Float){
price=((Float)arg) floatValue()
System out println( PriceObserver :price changet to +price)
}
}
}
Jsp 中我们可以来正式执行这段观察者程序:
<jsp:useBean id= product scope= session class= Product />
<jsp:setProperty name= product property= * />
<jsp:useBean id= nameobs scope= session class= NameObserver />
<jsp:setProperty name= product property= * />
<jsp:useBean id= priceobs scope= session class= PriceObserver />
<jsp:setProperty name= product property= * />
<%
if (request getParameter( save )!=null)
{
product saveToDb()
out println( 产品数据变动 保存! 并已经自动通知客户 )
}else{
//加入观察者
product addObserver(nameobs)
product addObserver(priceobs)
%>
//request getRequestURI()是产生本jsp 的程序名 就是自己调用自己
<form action= <%=request getRequestURI()%>method=post>
<input type=hidden name= save value= >
产品名称:<input type=text name= name >
产品价格:<input type=text name= price >
<input type=submit>
</form>
<%
}
%>
执行改Jsp 程序 会出现一个表单录入界面 需要输入产品名称 产品价格 点按Submit 后 还是执行该jsp 的
if (request getParameter( save )!=null)之间的代码
由于这里使用了数据javabeans 的自动赋值概念 实际程序自动执行了setName setPrice语句 你会在服务器控制台中发现下面信息::
NameObserver :name changet to ?????(Jsp 表单中输入的产品名称)
PriceObserver :price changet to ???(Jsp 表单中输入的产品价格)
这说明观察者已经在行动了 !!
同时你会在执行jsp 的浏览器端得到信息:
产品数据变动 保存! 并已经自动通知客户
上文由于使用jsp 概念 隐含很多自动动作 现将调用观察者的Java 代码写如下:
public class Test {
public static void main(String args[]){
Product product=new Product()
NameObserver nameobs=new NameObserver()
PriceObserver priceobs=new PriceObserver()
//加入观察者
product addObserver(nameobs)
product addObserver(priceobs)
product setName( 橘子红了 )
product setPrice( f)
}
}
你会在发现下面信息::
NameObserver :name changet to 橘子红了
PriceObserver :price changet to
lishixinzhi/Article/program/Java/gj/201311/27356
在java培训的过程中,我们需要了解到关于java的设计模式,下面是成都java培训http://www.kmbdqn.cn/介绍的关于java设计模式的相关介绍。
1、桥梁模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。
2、合成模式(Composite):将对象组合成树形结构以表示"部分-整体"的层次结构。
它使得客户对单个对象和复合对象的使用具有一致性。
3、抽象工厂模式(AbstractFactory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
4、装饰模式(Decorator):动态地给一个对象添加一些额外的职责。
就扩展功能而言,它能生成子类的方式更为灵活。
5、适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。
适配器模式使得原本由于接口或类不兼容而不能一起工作的类可以一起工作。
6、责任链模式(ChainofResponsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。
将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
7、工厂方法(FactoryMethod):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。
FactoryMethod使一个类的实例化延迟到其子类。
8、建造模式(Builder):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。
9、门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
10、命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化对请求排队或记录请求日志,以及支持可取消的 *** 作。
一、大约分为三类:
1、创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
2、结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
3、行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
二、设计模式遵循的原则有6个:
1、开闭原则(OpenClosePrinciple)
对扩展开放,对修改关闭。
2、里氏代换原则(LiskovSubstitutionPrinciple)
只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
3、依赖倒转原则(DependenceInversionPrinciple)
这个是开闭原则的基础,对接口编程,依赖于抽象而不依赖于具体。
4、接口隔离原则(InterfaceSegregationPrinciple)
使用多个隔离的借口来降低耦合度。
5、迪米特法则(最少知道原则)(DemeterPrinciple)
一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。
6、合成复用原则(CompositeReusePrinciple)
原则是尽量使用合成/聚合的方式,而不是使用继承。继承实际上破坏了类的封装性,超类的方法可能会被子类修改。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)