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"));

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

  • 相关阅读:
    ASP.NET MVC 重点教程一周年版 第二回 UrlRouting
    ASP.NET MVC 重点教程一周年版 第三回 Controller与View
    DynamicData for Asp.net Mvc留言本实例 下篇 更新
    Asp.net MVC视频教程 18 单选与复选框
    使用ASP.NET MVC Futures 中的异步Action
    ASP.NET MVC RC 升级要注意的几点
    ATL、MFC、WTL CString 的今生前世
    msvcprt.lib(MSVCP90.dll) : error LNK2005:已经在libcpmtd.lib(xmutex.obj) 中定义
    关于Windows内存的一些参考文章
    Windows访问令牌相关使用方法
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6785180.html
Copyright © 2011-2022 走看看