对Java设计模式的简单理解

什么样的需求使用哪种模式

Tom 创建于 2018-3-18

最新发表:


Jedis的简单使用

数据加速

对Java设计模式的简单理解

前言

客户端、前端和后端,不同的应用场景会使用不一样的设计模式。同样的Java也有它自己的MVC(Browser-Server-Database)。当然,为什么客户端开发就很少听说有IOC和AOP?

Java类的执行

简单的讲,每个class文件,都要通过ClassLoader去执行初始化方法

面向切面编程AOP

对于面向切面编程来讲,它的优势在于,可以把不同的逻辑层分离开来。比如业务日志和执行逻辑,可以做到最佳的分离。继承是一种常规的实现方式,继承对于实现来说复杂度要更高许多。

缺点,实现功能之前需要扫描相关组件,牺牲的是启动速度。一个Java小型框架服务启动普遍需要10秒以上,一个APP启动等10秒,估计没有人能接受。

控制反转IOC

对于页面来说,通常只有数据处理、界面展现需求。有VIPER设计思想,就可以解决复杂的视图、展现、数据、跳转之间的关系。后续维护,要换组件,重新开发后,只要处理界面之间的跳转关系关系就可以了。

Java组件可重用性在于容器管理和依赖注入,大大增强组件之间的可维护性、可测试性和可扩展性。控制反转(Inversion Of Control)在Spring采用Bean的容器实现通过XML解析的方式管理组件,就是所谓的反射(Reflection)编程。除此之外也可以通过在容器管理类中new一个Bean对象来实现基于代码的组件管理。这里贴一下反射的用法:

//需要动态加载的类和方法
public class DynamicClass {
    public void dynamicMethod(String str) {
        System.out.println("str = " + str);
    }
}
//反射,动态类创建与调用
Class clazz = Class.forName("DynamicClass");
Object obj = clazz.newInstance();
//匹配方法名的同时,参数也要匹配
Method method = clazz.getDeclaredMethod("dynamicMethod", String.class);
method.invoke(obj, "123");

比如在Java里面实现了一台车的逻辑作为组件。首先要得到它的实例,可以new一个,也可以通过容器拿。new一个,后续维护的话要知道在哪里new了。容器管理N个组件只要知道属于哪个容器即可,容器外面随处new对象,会对后续的代码维护造成不必要的麻烦。

组件的可扩展性,在于组装。按照依赖注入(Dependency Injection),设计的时候,需要理清扩展组件之间的关联关系,把可扩展的组件抽离出来,变成接口。例如一台车,需要把普通的轮胎换成雪地轮胎。就要先从容器获取一个车组件,在车里面提供一个set轮胎方法。通过XML配置的方式,set雪地轮胎以达到更换的目的。

依赖查找

通过Spring创建的Bean对象,可以通过@Autowired、@Resource拿到具体的对象

@Configuration
public class AppConfig {
    //用代码注册一个String类型的组件
    @Bean
    String getLocalDir() {
        return "localDir";
    }
}
//SpringMVC框架由浏览器触发的事件
@Controller
@RequestMapping("/")
public class FileController {
    @Autowired
    String localDir;
    @Resource(name="getLocalDir")
    String localDir2;

    //自动关联组件后,访问'/action'会拿得到localDir、localDir2的具体内容
    @RequestMapping(value="/action", method= RequestMethod.GET)
    public ModelAndView action() {
        System.out.println("localDir = "+localDir);
        System.out.println("localDir2 = "+localDir2);
	return new ModelAndView("redirect:/");//重定向到'/'
    }
}

还有一种常规的方式,加载完XML通过类名获取:

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("xxx.xml");
Object obj = applicationContext.getBean(classStr);

小结

Java与Objective C虽然都是动态语言,从应用场景、设计模式还是有很大区别的。虽然设计思想不分语言,具体应用场景不一样,不能随意套用。