`

java 设计模式 - 开闭原则

 
阅读更多
开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。

开闭原则(Open Closed Principle)

开闭原则的核心是:对扩展开放,对修改关闭。

白话意思就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化。

开闭原则算是前5中原则的一个抽象总结,前五种是开闭原则的一些具体实现,所以如果使用开闭原则,其实有点虚,因为它没有一个固定的模式,但是最终保证的是提高程序的复用性、可维护性等要求。

要使用这一原则还需要结合着它的思想“对扩展开放,对修改关闭”与其他的五大设计原则根据经验来开发项目。

大体是这个意思,如果想深究,还需要看看其他的书籍。

下面是使用开闭原则的一个简单示例,虽有些不准确,但是是这个意思(领会精神)。

定义一个接口,寻找美女

  1. package com.loulijun.chapter6;  
  2.    
  3. public interface IFindGirl {  
  4.     //年龄  
  5.     public int getAge();  
  6.     //姓名  
  7.     public String getName();  
  8.     //长相  
  9.     public String getFace();  
  10.     //身材  
  11.     public String getFigure();  

实现这个接口

  1. package com.loulijun.chapter6;  
  2.    
  3. public class FindGirl implements IFindGirl {  
  4.     private String name;  
  5.     private int age;  
  6.     private String face;  
  7.     private String figure;  
  8.        
  9.     public FindGirl(String name, int age, String face, String figure)  
  10.     {  
  11.         this.name = name;  
  12.         this.age = age;  
  13.         this.face = face;  
  14.         this.figure = figure;  
  15.     }  
  16.    
  17.     @Override 
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.    
  22.     @Override 
  23.     public String getFace() {  
  24.         return face;  
  25.     }  
  26.    
  27.     @Override 
  28.     public String getFigure() {  
  29.         return figure;  
  30.     }  
  31.    
  32.     @Override 
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.        
  37.    

场景:大街上

  1. package com.loulijun.chapter6;  
  2.    
  3. import java.text.NumberFormat;  
  4. import java.util.ArrayList;  
  5.    
  6. public class Street {  
  7.     private final static ArrayList<IFindGirl> girls = new ArrayList<IFindGirl>();  
  8.     //静态初始化块  
  9.     static 
  10.     {  
  11.         girls.add(new FindGirl("张含韵",23,"可爱型","165cm/47kg"));  
  12.         girls.add(new FindGirl("高圆圆",33,"时尚型","165cm/48kg"));  
  13.         girls.add(new FindGirl("章泽天",19,"清纯型","168cm/47kg"));  
  14.     }  
  15.     public static void main(String args[])  
  16.     {  
  17.         System.out.println("----------美女在这里----------");  
  18.         for(IFindGirl girl:girls)  
  19.         {  
  20.             System.out.println("姓名:"+girl.getName()+" 年龄:"+girl.getAge()+  
  21.                     "  长相:"+girl.getFace()+"  身材:"+girl.getFigure());  
  22.         }  
  23.     }  

运行结果:

----------美女在这里----------

姓名:张含韵 年龄:23 长相:可爱型 身材:165cm/47kg
姓名:高圆圆 年龄:33 长相:时尚型 身材:165cm/48kg
姓名:章泽天 年龄:19 长相:清纯型 身材:168cm/47kg

但是如果想独立分出一个外国美女的类别的话(比如增加一个国籍),可以通过修改接口、修改实现类、通过扩展来实现。

如果修改接口,也就意味着修改实现类,这样对项目的变动太大了,所以不推荐

如果修改实现类,这样虽能解决问题,但是明显有些牵强,如果需要其他变动的时候会显得逻辑混乱

所以,通过扩展来实现是最简单的方式

如何扩展:

可以定义一个IForeigner接口继承自IFindGirl,在IForeigner接口中添加国籍属性getCountry(),然后实现这个接口即可,然后就只需要在场景类中做稍微修改就可以了

  1. package com.loulijun.chapter6;  
  2.    
  3. public interface IForeigner extends IFindGirl {  
  4.     //国籍  
  5.     public String getCountry();  

实现接口

  1. package com.loulijun.chapter6;  
  2.    
  3. public class ForeignerGirl implements IForeigner {  
  4.     private String name;  
  5.     private int age;  
  6.     private String country;  
  7.     private String face;  
  8.     private String figure;  
  9.        
  10.     public ForeignerGirl(String name, int age, String country, String face, String figure)  
  11.     {  
  12.         this.name = name;  
  13.         this.age = age;  
  14.         this.country = country;  
  15.         this.face =face;  
  16.         this.figure = figure;  
  17.     }  
  18.     @Override 
  19.     public String getCountry() {  
  20.         // TODO Auto-generated method stub  
  21.         return country;  
  22.     }  
  23.    
  24.     @Override 
  25.     public int getAge() {  
  26.         // TODO Auto-generated method stub  
  27.         return age;  
  28.     }  
  29.    
  30.     @Override 
  31.     public String getFace() {  
  32.         // TODO Auto-generated method stub  
  33.         return face;  
  34.     }  
  35.    
  36.     @Override 
  37.     public String getFigure() {  
  38.         // TODO Auto-generated method stub  
  39.         return figure;  
  40.     }  
  41.    
  42.     @Override 
  43.     public String getName() {  
  44.         // TODO Auto-generated method stub  
  45.         return name;  
  46.     }  
  47.    

然后在场景类中只需要修改如下代码即可,其他不变

  1. girls.add(new ForeignerGirl("Avirl",28,"美国","性感型","160cm/45kg")); 

不过这些设计原则到不是绝对的,而是根据项目需求,实际需求来定夺使用。

原文链接:http://www.cnblogs.com/loulijun/archive/2012/03/14/2394055.html

分享到:
评论

相关推荐

    JAVA设计模式之设计原则 ---开闭原则源码

    开闭原则是面向对象设计中的一个核心原则,它在JAVA设计模式中占据着重要的地位。这一原则由格里·贝斯提出,旨在指导开发者如何设计可维护和可扩展的软件系统。开闭原则(Open-Closed Principle,OCP)的核心思想是...

    java设计模式---诙谐易懂版

    根据给定文件内容,以下是关于Java设计模式的知识点说明: 1. 策略模式(Strategy Pattern)是一种行为设计模式,允许在运行时选择算法的行为。策略模式的意图是定义一系列算法,将每个算法封装起来,并使它们可以...

    JAVA设计模式-原则和23种设计模式归纳总结

    本资源首先介绍了设计模式的六大原则,包括单一责任原则、开闭原则、里氏替换原则、接口隔离原则、合成复用原则和最少知道原则。然后,资源对23种设计模式进行了分类和总结,包括创建型模式、结构型模式和行为型模式...

    JAVA设计模式--程序设计--反射--注解--泛型

    这些模式提供了良好的可复用性和可扩展性,帮助开发者遵循“开闭原则”,即对修改关闭,对扩展开放。 其次,程序设计不仅关注代码的实现,更强调代码的组织结构和逻辑。在Java中,良好的程序设计包括模块化、封装、...

    Java设计模式-代理模式例子

    通过学习和实践代理模式,开发者可以更好地理解和掌握面向对象设计原则,如单一职责原则和开闭原则,同时也能提高代码的复用性和可测试性。在Java世界里,设计模式是连接理论和实践的重要桥梁,是每个专业开发者必备...

    JAVA开闭原则

    - **设计模式的应用**:策略模式、工厂模式、建造模式等多种设计模式都是开闭原则的具体实践。它们通过提供灵活的组件装配机制,使得系统能够容易地适应变化,而不需修改核心代码。 - **重构与优化**:在软件维护...

    JAVA设计模式-设计模式公司出品

    6. 开闭原则:软件实体应对扩展开放,对修改关闭。 这本书不仅讲解了具体的模式,还提供了与之相关的Java实现代码示例,使得程序员可以将理论应用到实际开发中。对于不同水平的程序员来说,这本书都能够提供很大的...

    Java设计模式教程 - Java设计模式 - 工厂模式

    Java设计模式是软件开发中的重要概念,它们是解决常见编程问题的经验总结,为代码组织提供了标准的结构和模式。工厂模式作为最常用的设计模式之一,是创建型模式的代表,它的主要目标是提供一个创建对象的接口,但让...

    Java设计模式-图解-附代码.doc

    它们帮助开发者遵循面向对象设计原则,如单一职责原则、开闭原则、里氏替换原则、依赖倒置原则和接口隔离原则,从而提高代码的可读性、可维护性和可复用性。 在实际编程中,理解并熟练应用设计模式可以使代码更加...

    java设计模式--策略模式

    Java设计模式——策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。策略模式定义了一族算法,并将每一个算法封装起来,使它们可以互相替换。这种模式让算法的变化独立于使用算法的客户。 在Java中,...

    1.java设计模式-创建者模式-简单工厂模式.pdf

    简单工厂模式是Java设计模式中创建型模式的一种,也被称为静态工厂方法模式。该模式的主要思想是由一个专门的工厂类来负责创建其他类的实例。简单工厂模式通过封装创建对象的过程,使得调用者无需关心对象的具体创建...

    Java设计模式-图解-附代码

    ### Java设计模式详解 #### 一、概述 设计模式是在软件设计过程中针对常见的问题而提出的通用解决方案。在Java编程中,设计模式可以帮助开发者编写出更易于维护和扩展的代码。根据设计模式的目的不同,通常将其...

    java 设计模式之状态模式

    3. 改变对象状态不会影响到客户端代码,符合开闭原则。 ### 缺点 1. 增加了系统类和对象的个数,因为每个状态都需要一个类来表示。 2. 如果状态过多,可能导致状态之间的转换关系变得复杂,不易维护。 3. 状态模式...

    java设计模式-工厂模式

    Java设计模式中的工厂模式是一种创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,当客户端请求创建一个产品对象时,它不会直接创建,而是调用一个工厂对象来完成创建工作。这种模式的核心在于封装了对象...

    Java设计模式-23种设计模式详解

    1. 开闭原则(Open Closed Principle):一个软件实体,如类、模块和函数应该对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,而是要扩展原有代码,实现一个热插拔的效果。 2. 单一职责...

    java 设计模式-个人总结

    - **优点**:遵循开闭原则,易于扩展。 ##### 8. 建造者模式 (Builder) - **定义**:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - **应用场景**:当创建复杂对象的算法应该独立...

    该怎么使用Java设计模式编程中的OCP开闭原则?.pdf

    该怎么使用 Java 设计模式编程中的 OCP 开闭原则? 在软件开发中,开闭原则是面向对象设计中最基础的设计原则之一,它指导我们如何建立稳定灵活的系统。开闭原则定义:一个软件实体如类、模块和函数应该对扩展开放...

    java设计模式(刘伟)

    - **开闭原则**:软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。 - **里氏代换原则**:子类型必须能够替换掉它们的基类型。 - **依赖倒转原则**:高层模块不应该依赖低层模块,二者都应该依赖其抽象;...

    Java设计模式-简单工厂

    **Java设计模式——简单工厂** 简单工厂模式是软件设计模式中的一种基础模式,它属于创建型设计模式。在Java编程中,我们常常会遇到需要创建一系列相关或相互依赖的对象,而这些对象的创建过程可能会非常复杂。这时...

Global site tag (gtag.js) - Google Analytics