zoukankan      html  css  js  c++  java
  • 设计模式6大原则开闭原则

    开闭原则(Open Closed Principle)

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

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

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

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

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

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

    定义一个接口,寻找美女

    package com.loulijun.chapter6;
    
    public interface IFindGirl {
    	//年龄
    	public int getAge();
    	//姓名
    	public String getName();
    	//长相
    	public String getFace();
    	//身材
    	public String getFigure();
    }
    

    实现这个接口

    package com.loulijun.chapter6;
    
    public class FindGirl implements IFindGirl {
    	private String name;
    	private int age;
    	private String face;
    	private String figure;
    	
    	public FindGirl(String name, int age, String face, String figure)
    	{
    		this.name = name;
    		this.age = age;
    		this.face = face;
    		this.figure = figure;
    	}
    
    	@Override
    	public int getAge() {
    		return age;
    	}
    
    	@Override
    	public String getFace() {
    		return face;
    	}
    
    	@Override
    	public String getFigure() {
    		return figure;
    	}
    
    	@Override
    	public String getName() {
    		return name;
    	}
    	
    
    }
    

    场景:大街上

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

    运行结果:

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

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

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

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

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

    如何扩展:

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

    package com.loulijun.chapter6;
    
    public interface IForeigner extends IFindGirl {
    	//国籍
    	public String getCountry();
    }
    

    实现接口

    package com.loulijun.chapter6;
    
    public class ForeignerGirl implements IForeigner {
    	private String name;
    	private int age;
    	private String country;
    	private String face;
    	private String figure;
    	
    	public ForeignerGirl(String name, int age, String country, String face, String figure)
    	{
    		this.name = name;
    		this.age = age;
    		this.country = country;
    		this.face =face;
    		this.figure = figure;
    	}
    	@Override
    	public String getCountry() {
    		// TODO Auto-generated method stub
    		return country;
    	}
    
    	@Override
    	public int getAge() {
    		// TODO Auto-generated method stub
    		return age;
    	}
    
    	@Override
    	public String getFace() {
    		// TODO Auto-generated method stub
    		return face;
    	}
    
    	@Override
    	public String getFigure() {
    		// TODO Auto-generated method stub
    		return figure;
    	}
    
    	@Override
    	public String getName() {
    		// TODO Auto-generated method stub
    		return name;
    	}
    
    }
    

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

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

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

     

  • 相关阅读:
    HBase读写数据的详细流程及ROOT表/META表介绍
    HBase的概述和安装部署
    Linux常用命令行补充——持续更新
    电信项目java补充类
    Kafka的接口回调 +自定义分区、拦截器
    Kafka命令行操作及常用API
    Kafka概述及安装部署
    Kafka生产者案例报警告SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
    python threading
    python thread
  • 原文地址:https://www.cnblogs.com/loulijun/p/2394055.html
Copyright © 2011-2022 走看看