`
prodream
  • 浏览: 102167 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

使用Spring编写第一个程序-spring初级体验

阅读更多

对最原始的HelloWorld.java写法分析:

一个HelloWorld有两个职责,一个是获得外部参数,另一个决定如何显示

第一次改进:分离职能

//消息显示者接口

MessageDisplayer.java

package prodream.com

public interface MessageSupplice{

public void setMessageSupplice(Message supplier);

public void display();

}

//实现MessageDisplayer接口

ConcreteMessageDisplayer.java

package prodream.com

public class ConreteMessageDisplayer{

private MessageSupplier suppier;

public void setMessageSupplier(MessageSupplier supplier){

this.supplier=supplier;

}

public void display(){

if(supplier==nul)

throw new RuntimeException();

System.out.println(supplier.getMessage());

}

}

//消息提供者接口

MessageSupplier.java

package prodream.com;

public interface MessageSupplier{

String getMessage();

}

//实现MessageSupplier接口

HelloWorldMessageSupplier.java

public class HelloWorldMessageSupplier{

public String getMessage(){

return "Hello World";

}

}

//主程序

HelloWorld.java:

public class HelloWorld{

public static void main(String[] args){

//创建消息提供者

MessageSupplier msgSupplier=new HelloWorldMessageSupplier();

//创建消息显示者

MessageDisplayer msgDisplayer=new ConcreteMessageDisplayer();

//注入消息提供者

msgDisplayer.setMessageSupplier(msgSupplier);

//显示相应信息

msgDisplayer.display();

}

分析:如果希望替换MessageDisplayer或者MessageSupplier的实现类,那么需要修改主程序中手动更改,那么运用程序代码又将经历编译测试的风险。

解决方法是通过外部的属性文件来读取相应实例类的名字

//我觉得这样不能体现什么大的价值,正如有写对spring的注入式的分析中写的一样,这种依赖转向对配置文件的依赖

再次改进:引入单例工厂

MessageSupportFactoruy.java:

package prodream.com;

import java.io.FileInputStream;

import java.util.Properties;

public class MessageSupportFactory{

private static MessageSupportFactory instance=null;

privateProperties props=null;

public synchronized static MessageSupportFactory getInstance(){

if(instance==null)

instance=new MessageSupportFactory();

return instance;

public MessageSupportFactory(){

props=new Properties();

try{

props.load(new FileInputStream("conf/msgbean.properties");

}

catch(Exception ex){

ex.printStackTrace();

}

}

public MessageDisplayer makeDisplayer(){

String displayClass=props.getProperty("displayer.class");

try{

return (MessageDisplayer) Class.forName(disaplayerClass).newInstance();

}

catch(ClassNotFoundException e){

System.out.println("Could't found class:" +displayClass);

}

catch(InstaniationException e){

System.out.println("Couldn't instaniate an object of type:" +displayerClass);

}

catch(IllegalAccessException e){

System.out.println("couldn't access class:"+displayerClass);

}

return null;

}

public MessageSupplier makeSupplier(){

String supplierClass=props.getProperty("supplier.class");

try{

return (MessageSupplierr) Class.forName(supplierClass).newInstance();

}

catch(ClassNotFoundException e){

System.out.println("Could't found class:" +supplierClass);

}

catch(InstaniationException e){

System.out.println("Couldn't instaniate an object of type:" +supplierClass);

}

catch(IllegalAccessException e){

System.out.println("couldn't access class:"+supplierClass);

}

return null;

}

}

vmsbean.properties的内容:

displayer.class=prodream.com.ConcreteMessageDiaplayer

supplier.class=prodream.com.HelloWorldSupplier

//主程序

HelloWorldWithFactory.java:

public class HelloWorldWithFactory{

public static void main(String[] args){

//创建消息提供者

MessageSupplier msgSupplier=MessageSupportFactory.getInstance().makeSupplier();

//创建消息显示者

MessageDisplayer msgDisplayer=MessageSupportFactory.getInstance().makeDisplayer();

//注入消息提供者

msgDisplayer.setMessageSupplier(msgSupplier);

//显示相应信息

msgDisplayer.display();

}

引入了工厂抽离了部分类实例化的硬编码(hard code,简单说就是一种代码不灵活的体现看他们往往可以通过外部设置,设计模式,重构等手段来解决)

。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics