??xml version="1.0" encoding="utf-8" standalone="yes"?>97影视大全免费追剧大全在线观看 ,国产九九在线,亚洲精品免费在线视频http://www.aygfsteel.com/mark1207/category/30107.htmlMyEclipse, Java EE, Spring, Struts, Hibernate, JPA, SWT, Swing, AJAX, JavaScript,SOAzh-cnSat, 12 Apr 2008 14:20:05 GMTSat, 12 Apr 2008 14:20:05 GMT60Q{Q《分析模式:(x)可重用对象模型?- 责Q模式(party)http://www.aygfsteel.com/mark1207/archive/2008/04/01/190072.htmlMarkMarkTue, 01 Apr 2008 06:35:00 GMThttp://www.aygfsteel.com/mark1207/archive/2008/04/01/190072.htmlhttp://www.aygfsteel.com/mark1207/comments/190072.htmlhttp://www.aygfsteel.com/mark1207/archive/2008/04/01/190072.html#Feedback0http://www.aygfsteel.com/mark1207/comments/commentRss/190072.htmlhttp://www.aygfsteel.com/mark1207/services/trackbacks/190072.html1          Q?/span>Reusable Object Models标准?/span>

1.1    Party模式

模式Q在q行pȝ分析和概忉|型设计的时候,l常发现人和各种各样的组l有着同样的行?/em>Q例如,固定?sh)话的计费可能是针对个hQ也可能是一个单位;需要各U服务的时候,你可能求助于一个服务公司,或者服务公怸个特定的业务员。MQ因ZhQ?strong>PersonQ表C的一致性,如下图所见,我们从中抽象?/span>Party?/span>Organization

    OrganizationQ的内部l构Q就?x)发C些有的问题Q通常最常见的一U结构是金字塔结构,因此建模时可能按照这L(fng)l构建立U性的模型Q例如:(x)

q样的模型ƈ没有错误Q但是有~陷Q首先不能满x(chng)较复杂的l织关系Q更严重的是Q一?strong>需要更多的层次关系Q例如存在部门直接上下关系以及(qing)区域附属理方式Q必引h个模型的更改Q对pȝ的媄(jing)响可惌知Q在q种情况下,最通常的改q措施是引入层次关系Q如下图所C:(x)

Q之间的各种关系以及(qing)可能的变化。在上图中,{hierarchy}Q来限定关系?/span>

1.3        W三步,在一般的情况下,以上的模式已l够解决问题,但当q样的层ơ和l织关系很多而且复杂Ӟ过两种Q,例如现在行的矩늮理,可以将关系本n抽取出来独立处理Q如下图所C,作者此时考虑到组l结构的有效时段Q所以加入了(jin)一个时间段属性来记录l织l构的存在时间?/p>

才是模式的核?j),在系l中Q由两个Organization?/span>subsidiary实例来说明该l构的类型。在q样的结构中Q可能存在许多的规则Q?strong>Rule很多Q而且规则主要?/span>Type相关联;如果Type的子cd变化Q就可以分布?/span>Organization    ?strong>Person的抽象父c,因此?/span>PartyQ模式?/span>

    的数量比Accountability的规则也变得更ؓ(f)复杂Q要解决q样的问题,可以引入知识层和操作层的分R?/span>

Q和操作层(Operational levelQ由三个cd作完成,它们分别?/span>Accountablity Type?/span>Party Type中定义合法的Party?/span>AccountablityQ运行时的配|;换句话说Q当知识层的规则改变Ӟpȝ的行为将被改变,而不需要Q何其他代码的改动Q这当然是一U比较理惛_的情c(din)?/span>

 

由此惛_Q构Z家系l的设计思\也可以从q个模式得到一些启发,q是W者一时的感触?/p>

在原书中Q如何实现这L(fng)模型提得比较模糊Q但是笔者认为,可以它们作为正常的模型来实玎ͼ两个层次的区分只是表明它们各自担负的d和地位不同。知识层們֐于描q系l可能存在的各种形式Qƈ讑֮判断pȝ是否有效的各U规则;操作层则描述在这L(fng)配置下系l实际的行ؓ(f)。通过改变内在的配|来改变外在的行为,是q个模式的目的?/p>

׃q个模式的特点,改变pȝ行ؓ(f)时不必更Ҏ(gu)作层的代码,但是Qƈ不意味着改变pȝ行ؓ(f)q测试也不必要做。同P也需要调试、配|管理?/p>

作者也提到Q这L(fng)模式用v来ƈ不轻松,甚至在一般的pȝ中也不必要,但当你发现有必要用它的时候,别犹豫(感觉象用降落伞一P(j)Q?/p>

1.6        ?qing)其关系的各U模式,每种推荐的模式都有其表现的机?x),希望我这文章可以vC些抛砖引玉的作用QƈƢ迎大家对其中的错误q行指正Q欢q发表意见,q行交流?/span>

Q?/span>Reusable Object ModelsQ?/span>Martin Fowler


原文Q?a >http://blog.csdn.net/nzh_csdn/archive/2004/12/19/221484.aspx

Mark 2008-04-01 14:35 发表评论
]]>观察者模式(二)(j)http://www.aygfsteel.com/mark1207/archive/2008/03/18/187004.htmlMarkMarkTue, 18 Mar 2008 07:04:00 GMThttp://www.aygfsteel.com/mark1207/archive/2008/03/18/187004.htmlhttp://www.aygfsteel.com/mark1207/comments/187004.htmlhttp://www.aygfsteel.com/mark1207/archive/2008/03/18/187004.html#Feedback0http://www.aygfsteel.com/mark1207/comments/commentRss/187004.htmlhttp://www.aygfsteel.com/mark1207/services/trackbacks/187004.html
拉:(x)也就是观察者来军_接到“可观察?#8221;c通知时获?#8220;可观察?#8221;的哪些变化。调用方法notifyObserversQ)(j)Q?br />
推:(x)“可观察?#8221;c通知观察者时传递给观察者自w所有的变化。调用方法notifyObserversQObject argQ;


import java.util.Observable;
import java.util.Observer;
 //此类实现的是“?#8221;的发式,l承java.util.Observablec?br /> public class WeatherData extends Observable {
 private float temperature;
 private float humidity;
 private float pressure;
 //构造器不需要ؓ(f)?jin)记住观察者们而徏立数据结构了(jin)
 public WeatherData() { }
 
 public void measurementsChanged() {
  setChanged();//指示可观察者状态已改变Q可以由状态是否改变决定是否通知观察者,很容易,自己实现pQ?br />   notifyObservers();//没有调用传送数据对象,表示采用“?#8221;的做?br />  }
 
 public void setMeasurements(float temperature, float humidity, float pressure) {
  this.temperature = temperature;
  this.humidity = humidity;
  this.pressure = pressure;
  measurementsChanged();
 }
 //以下不是新方法,而是Z(jin)使用“?#8221;的做?br />  public float getTemperature() {
  return temperature;
 }
 
 public float getHumidity() {
  return humidity;
 }
 
 public float getPressure() {
  return pressure;
 }
}


import java.util.Observable;
import java.util.Observer;
 //实现java.util.Observer接口Q成察?br /> public class CurrentConditionsDisplay implements Observer, DisplayElement {
 Observable observable;
 private float temperature;
 private float humidity;
 //构造器需要Observable 作ؓ(f)参数Qƈ本对象登记察?br />  public CurrentConditionsDisplay(Observable observable) {
  this.observable = observable;
  observable.addObserver(this);
 }
 //改变update()Ҏ(gu)Q增加Observable 和数据对象ؓ(f)参数
 public void update(Observable obs, Object arg) {
  if (obs instanceof WeatherData) {
   WeatherData weatherData = (WeatherData)obs;
   this.temperature = weatherData.getTemperature();
   this.humidity = weatherData.getHumidity();
   display();
  }
 }
 
 public void display() {
  System.out.println("Current conditions: " + temperature
   + "F degrees and " + humidity + "% humidity");
 }
}

注意Qjava.util.Observable是一个类而不是接口,而且q没有实CQ何接口。它本n的实现有很多问题Q限制了(jin)它的使用和复用。由于它是个c,所以我们只能承,java不允许多l承Q所以限制了(jin)其复用潜力。而且setChanged()Ҏ(gu)被保护v来(被定义成protectedQ,q就意味着除非l承Q否则无法创建实例ƈl合到自q对象中,q就q背?jin)设计原?#8220;多用l合Q少用?#8221;?/span>

Mark 2008-03-18 15:04 发表评论
]]>
观察者模式(一Q?/title><link>http://www.aygfsteel.com/mark1207/archive/2008/03/18/186986.html</link><dc:creator>Mark</dc:creator><author>Mark</author><pubDate>Tue, 18 Mar 2008 05:52:00 GMT</pubDate><guid>http://www.aygfsteel.com/mark1207/archive/2008/03/18/186986.html</guid><wfw:comment>http://www.aygfsteel.com/mark1207/comments/186986.html</wfw:comment><comments>http://www.aygfsteel.com/mark1207/archive/2008/03/18/186986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/mark1207/comments/commentRss/186986.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/mark1207/services/trackbacks/186986.html</trackback:ping><description><![CDATA[<p><br />         观察者模式:(x)在对象之间定义一对多的依赖,当一个对象改变状态,依赖他的对象都会(x)收到通知Qƈ自动更新。(以松耦合方式在一pd对象之间沟通状态,代表人物--MVCQ?br /> <br />         注意事项Q主题(可观察者)(j)用一个共同的接口来更新观察者,主题?sh)知道观察者的l节Q只知道观察者实C(jin)观察者接口。用此模式Ӟ你可从被观察者处推(pushQ或拉(pullQ数据(推的方式被认为更正确Q。有多个观察者时Q不可以依赖特定的通知序。java有多U观察者模式的实现Q包括java.util.Observable(有一些违背设计原则的问题Q有必要的话可以实现自己的Observable)QJavaBeans,RMI{,Swing大量使用此模式,许多GUI框架也是如此?br /> <br /> </p> 用观察者模式实C个气象站的实例:(x)<br /> 要求当WeatherData对象Q接受物理气象站数据的对象)(j)更新数据Ӟ随即?x)更C个布告板的显C:(x)目前状况Q温度、湿度、气压)(j)、气象统计和天气预报。ƈ且公布API可以让其他h写出自己的布告板?br /> <br /> 代码Q?br /> //主题接口Q提供注册、删除、更新布告板的方?br /> public interface Subject {<br />  public void registerObserver(Observer o);<br />  public void removeObserver(Observer o);<br />  public void notifyObservers();<br /> }<br /> <br /> //观察者接口,提供更新本布告板的方?br /> public interface Observer {<br />  public void update(float temp, float humidity, float pressure);<br /> }<br /> <br /> //布告板显C接口,提供布告板显C的Ҏ(gu)<br /> public interface DisplayElement {<br />  public void display();<br /> }<br /> <br /> //主题实现c?br /> public class WeatherData implements Subject {<br />  private ArrayList observers;<br />  private float temperature;<br />  private float humidity;<br />  private float pressure;<br />  //构造方法中初始化观察者记?br />  public WeatherData() {<br />   observers = new ArrayList();<br />  }<br />  //注册观察?br />  public void registerObserver(Observer o) {<br />   observers.add(o);<br />  }<br />  //删除观察?br />  public void removeObserver(Observer o) {<br />   int i = observers.indexOf(o);<br />   if (i >= 0) {<br />    observers.remove(i);<br />   }<br />  }<br />  //当主题状态改变时调用Q以通知所有观察?br />  public void notifyObservers() {<br />   for (int i = 0; i < observers.size(); i++) {<br />    Observer observer = (Observer)observers.get(i);<br />    observer.update(temperature, humidity, pressure);<br />   }<br />  }<br />  //通知观察者方?br />  public void measurementsChanged() {<br />   notifyObservers();<br />  }<br />  //更新数据Ҏ(gu)<br />  public void setMeasurements(float temperature, float humidity, float pressure) {<br />   this.temperature = temperature;<br />   this.humidity = humidity;<br />   this.pressure = pressure;<br />   measurementsChanged();<br />  }<br />  <br />  // other WeatherData methods here<br />  <br />  public float getTemperature() {<br />   return temperature;<br />  }<br />  <br />  public float getHumidity() {<br />   return humidity;<br />  }<br />  <br />  public float getPressure() {<br />   return pressure;<br />  }<br /> }<br /> <br /> //观察者实现类<br /> public class CurrentConditionsDisplay implements Observer, DisplayElement {<br />  private float temperature;<br />  private float humidity;<br />  private Subject weatherData;<br />  //构造方法中把此观察者注册到主题<br />  public CurrentConditionsDisplay(Subject weatherData) {<br />   this.weatherData = weatherData;<br />   weatherData.registerObserver(this);<br />  }<br />  //修改观察者状?br />  public void update(float temperature, float humidity, float pressure) {<br />   this.temperature = temperature;<br />   this.humidity = humidity;<br />   display();<br />  }<br />  //昄布告板更新内?br />  public void display() {<br />   System.out.println("Current conditions: " + temperature <br />    + "F degrees and " + humidity + "% humidity");<br />  }<br /> }<br /> <br /> <p>public class ForecastDisplay implements Observer, DisplayElement {<br />  private float currentPressure = 29.92f;  <br />  private float lastPressure;<br />  private WeatherData weatherData;</p> <p> public ForecastDisplay(WeatherData weatherData) {<br />   this.weatherData = weatherData;<br />   weatherData.registerObserver(this);<br />  }</p> <p> public void update(float temp, float humidity, float pressure) {<br />                 lastPressure = currentPressure;<br />   currentPressure = pressure;</p> <p>  display();<br />  }</p> <p> public void display() {<br />   System.out.print("Forecast: ");<br />   if (currentPressure > lastPressure) {<br />    System.out.println("Improving weather on the way!");<br />   } else if (currentPressure == lastPressure) {<br />    System.out.println("More of the same");<br />   } else if (currentPressure < lastPressure) {<br />    System.out.println("Watch out for cooler, rainy weather");<br />   }<br />  }<br /> }<br /> </p> <br /> <p>public class StatisticsDisplay implements Observer, DisplayElement {<br />  private float maxTemp = 0.0f;<br />  private float minTemp = 200;<br />  private float tempSum= 0.0f;<br />  private int numReadings;<br />  private WeatherData weatherData;</p> <p> public StatisticsDisplay(WeatherData weatherData) {<br />   this.weatherData = weatherData;<br />   weatherData.registerObserver(this);<br />  }</p> <p> public void update(float temp, float humidity, float pressure) {<br />   tempSum += temp;<br />   numReadings++;</p> <p>  if (temp > maxTemp) {<br />    maxTemp = temp;<br />   }<br />  <br />   if (temp < minTemp) {<br />    minTemp = temp;<br />   }</p> <p>  display();<br />  }</p> <p> public void display() {<br />   System.out.println("Avg/Max/Min temperature = " + (tempSum / numReadings)<br />    + "/" + maxTemp + "/" + minTemp);<br />  }<br /> }<br /> </p> <br /> //试c?br /> <p>public class WeatherStation {</p> <p> public static void main(String[] args) {<br />   WeatherData weatherData = new WeatherData();<br />  <br />   CurrentConditionsDisplay currentDisplay = <br />    new CurrentConditionsDisplay(weatherData);<br />   StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);<br />   ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);</p> <p>  weatherData.setMeasurements(80, 65, 30.4f);<br />   weatherData.setMeasurements(82, 70, 29.2f);<br />   weatherData.setMeasurements(78, 90, 29.2f);<br />  }<br /> }<br /> <br /> 当我们想d一个布告板的时候只要实现观察者借口可以加入主题通知的记录中Q实际代码如下:(x)<br /> //我们要添加一个酷热指数的布告板,利用一套公式来计算L(fng)指数?br /> </p> <p>public class HeatIndexDisplay implements Observer, DisplayElement {<br />  float heatIndex = 0.0f;<br />  private WeatherData weatherData;</p> <p> public HeatIndexDisplay(WeatherData weatherData) {<br />   this.weatherData = weatherData;<br />   weatherData.registerObserver(this);<br />  }</p> <p> public void update(float t, float rh, float pressure) {<br />   heatIndex = computeHeatIndex(t, rh);<br />   display();<br />  }<br />  //L(fng)指数计算<br />  private float computeHeatIndex(float t, float rh) {<br />   float index = (float)((16.923 + (0.185212 * t) + (5.37941 * rh) - (0.100254 * t * rh) <br />    + (0.00941695 * (t * t)) + (0.00728898 * (rh * rh)) <br />    + (0.000345372 * (t * t * rh)) - (0.000814971 * (t * rh * rh)) +<br />    (0.0000102102 * (t * t * rh * rh)) - (0.000038646 * (t * t * t)) + (0.0000291583 * <br />    (rh * rh * rh)) + (0.00000142721 * (t * t * t * rh)) + <br />    (0.000000197483 * (t * rh * rh * rh)) - (0.0000000218429 * (t * t * t * rh * rh)) +<br />    0.000000000843296 * (t * t * rh * rh * rh)) -<br />    (0.0000000000481975 * (t * t * t * rh * rh * rh)));<br />   return index;<br />  }</p> <p> public void display() {<br />   System.out.println("Heat index is " + heatIndex);<br />  }<br /> }<br /> <br /> //加入L(fng)指数布告板后的测试类<br /> </p> <p>public class WeatherStationHeatIndex {</p> <p> public static void main(String[] args) {<br />   WeatherData weatherData = new WeatherData();<br />   CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);<br />   StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);<br />   ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData);<br />   HeatIndexDisplay heatIndexDisplay = new HeatIndexDisplay(weatherData);</p> <p>  weatherData.setMeasurements(80, 65, 30.4f);<br />   weatherData.setMeasurements(82, 70, 29.2f);<br />   weatherData.setMeasurements(78, 90, 29.2f);<br />  }<br /> }</p> <img src ="http://www.aygfsteel.com/mark1207/aggbug/186986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/mark1207/" target="_blank">Mark</a> 2008-03-18 13:52 <a href="http://www.aygfsteel.com/mark1207/archive/2008/03/18/186986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OO设计原则http://www.aygfsteel.com/mark1207/archive/2008/03/18/186984.htmlMarkMarkTue, 18 Mar 2008 05:48:00 GMThttp://www.aygfsteel.com/mark1207/archive/2008/03/18/186984.htmlhttp://www.aygfsteel.com/mark1207/comments/186984.htmlhttp://www.aygfsteel.com/mark1207/archive/2008/03/18/186984.html#Feedback0http://www.aygfsteel.com/mark1207/comments/commentRss/186984.htmlhttp://www.aygfsteel.com/mark1207/services/trackbacks/186984.html 2、针对借口~程Q而不是针对实现编E?nbsp;?br /> 3、多用组合,用l承?br /> 4、ؓ(f)交互对象之间的松耦合设计而努力(松耦合设计更有Ҏ(gu),更能应对变化Q?
5、类应该Ҏ(gu)展开放,对修改关闭?
6、依赖抽象,不要依赖具体cR?

Mark 2008-03-18 13:48 发表评论
]]>
{略模式http://www.aygfsteel.com/mark1207/archive/2008/03/17/186698.htmlMarkMarkMon, 17 Mar 2008 01:55:00 GMThttp://www.aygfsteel.com/mark1207/archive/2008/03/17/186698.htmlhttp://www.aygfsteel.com/mark1207/comments/186698.htmlhttp://www.aygfsteel.com/mark1207/archive/2008/03/17/186698.html#Feedback0http://www.aygfsteel.com/mark1207/comments/commentRss/186698.htmlhttp://www.aygfsteel.com/mark1207/services/trackbacks/186698.html
    个h理解Q策略模式就是把父类中需要根据不同情况而变化的行ؓ(f)x(chng)“一族算?#8221;Qƈ把它抽象出来变成两个接口Q在父类中包含这个接口类型的属性,q样可以利用不同的接口实现cL改变q个行ؓ(f)。ƈ且添加了(jin)getter,setterҎ(gu)后可以在q行旉意改变行为的实现Q这样就可以使我们的设计更加富有Ҏ(gu),可以使我们的设计更加易于l护和扩展?

实例代码Q?br />
要求Q所有的各类鸭子l承一个超c,q且可以拥有自己的特性,可以因ؓ(f)需求变化而改变某个鸭子或某一c鸭子的某种Ҏ(gu)(如可以改变叫声和飞行状态)(j)?br />
//鸭子类
public abstract class Duck {
//飞行状态算法族
 FlyBehavior flyBehavior;
//鸣叫状态算法族
 QuackBehavior quackBehavior;
 
 public Duck() {
 }
 //改变法l状态的Ҏ(gu)Q可是在q行时改变特性的Ҏ(gu)
 public void setFlyBehavior (FlyBehavior fb) {
  flyBehavior = fb;
 }
 
 public void setQuackBehavior(QuackBehavior qb) {
  quackBehavior = qb;
 }
 //由子cȝ承ƈ实现的鸭子特性(不会(x)改变Q?br />  abstract void display();
 //由子cȝ承的飞行和鸣叫方?br />  public void performFly() {
  flyBehavior.fly();
 }
 
 public void performQuack() {
  quackBehavior.quack();
 }
 
 public void swim() {
  System.out.println("All ducks float, even decoys!");
 }
}

//飞行接口
public interface FlyBehavior {
 public void fly();
}

//飞行状态实现类Q不能飞Q?br /> public class FlyNoWay implements FlyBehavior {
 public void fly() {
  System.out.println("I can't fly");
 }
}

//火箭助推?br /> public class FlyRocketPowered implements FlyBehavior {
 public void fly() {
  System.out.println("I'm flying with a rocket");
 }
}
//鸣叫接口
public interface QuackBehavior {
 public void quack();
}

//鸣叫状态实现类Q不能叫Q?br /> public class MuteQuack implements QuackBehavior {
 public void quack() {
  System.out.println("<< Silence >>");
 }
}

//一个模型鸭的子c,在创建时指定Ҏ(gu)?br /> public class DecoyDuck extends Duck {
//在构造器中指定飞行特性和鸣叫Ҏ(gu)(不能飞,不能叫)(j)
 public DecoyDuck() {
  setFlyBehavior(new FlyNoWay());
  setQuackBehavior(new MuteQuack());
 }

 public void display() {
  System.out.println("I'm a duck Decoy");
 }
}

//试E序

public class MiniDuckSimulator {
 
 public static void main(String[] args) {
 
  DecoyDuck decoy = new DecoyDuck();

  decoy.performQuack();
   
  decoy .performFly(); 
//q行时把飞行状态改为火助推器飞行
  decoy .setFlyBehavior(new FlyRocketPowered());
  decoy .performFly();
 }
}



Mark 2008-03-17 09:55 发表评论
]]>
վ֩ģ壺 ̨| | | | | â| °Ͷ| ͤ| ٷ| Դ| ֽ| | ɽ| | | ͩ| ƽԭ| | | | ƾ| ͩ| ߱| ԭ| | ̨| ӳ| | | | | | | | ˱| | | | ƽ| | |