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

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

  • 相关阅读:
    Xib和storyboard对比
    IOS中用模型取代字典的好处
    IOS中UIButton和UIImageView的区别
    Response对象
    ASP.NET内置对象
    ASP.NET最常用的页面生命周期事件
    构造函数与析构函数
    C#程序设计基础——类、对象、方法
    CI框架分页(不解错误)
    Linux 下直连ipad mini充电(实战)
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6785180.html
Copyright © 2011-2022 走看看