设计模式(一)

简介

  • 软件模式
    • 软件开发中的重复出现的问题的解决方案,可认为是设计经验,在讨论问题的解决方案时,一种可交流的词汇
  • 设计模式
    • 简言之,就是可重复使用的设计经验,主要还是为了达到优化设计的目的
  • 软件开发中的几个模式
    • 业务领域模式
    • 分析模式
    • 设计模式
    • Idioms模式
  • 记录设计模式的四个要素
    • 名称
    • 问题
    • 方案
    • 效果
  • 设计模式的起源
    • 软件领域的设计模式起源于建筑学
    • 建筑大师Alexander出版了《A pattern Language:Towns,Building,Construction》一书,将建筑领域的许多问题的最佳解决方案记录为200多种模式,其著作的思想不仅在建筑行业影响深远,很快影响到了软件设计领域
    • 目前,被公认的在设计模式最有影响力的著作Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides的著作《Design Pattern:Elements of Reusable Object-Orient Software》(《设计模式:可复用的面向对象软件的基本原理》),讲述了23个设计模式,四位作者的著作成为空前畅销书,被大众戏称GOF之书,学习设计模式必读著作
  • 框架与设计模式的区别
    • 层次不同
      • 模式比框架更抽象,框架不是一种可重用的设计方案,是为解决某种问题的一些类的集合
    • 范围不同
      • 模式本质上是逻辑概念,框架是以具体的软件组织存在的
    • 相互关系
      • 一个框架会包含多个设计模式,一个著名的框架往往是许多设计模式的具体体现

面向对象的几个基本原则

  • 面向抽象原则

    • 抽象类

      • 可以有抽象方法也可以有非抽象方法
      • 不能用new运算符创建对象
      • 子类必须重写父类的abstract方法
      • 可作为上转型对象
    • 接口

      • 接口中只能有public权限的abstract的方法,能不能有abstract方法

      • 接口由类来实现,必须重写接口中的abstract方法

      • 接口回调

        • 可以把实现接口的类的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类实现的接口中的方法

          // Com.java
          public interface Com{
          	public abstract int sub(int x,int y);
          }
          // ComImp.java
          class ComImp implements Com{
              public int sub(int x,int y){
                  return x-y;
              }
          }
          // Application.java
          public class Application{
              public static void main(String args[]){
                  Com com;
                  com = new ComImp();
                  int m = com.sub(8,2);
                  system.out.println(m);
              }
          }
          
          
          
    • 所谓面向抽象编程,是指设计一个类的时候,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量

      举个例子,计算一个柱体的体积。

      // Geometry.java
      public abstract class Geometry {
          public abstract double getArea();
      }
      // Pillar.java
      public class Pillar {
          private  Geometry bottom; // 抽象类
          private  double height;
          Pillar(Geometry bottom,double height){
              this.bottom = bottom;
              this.height = height;
          }
          public double getVolume(){
              return bottom.getArea()*height;  // bottom可以调用子类重写的getArea方法
          }
      }
      // Circle.java
      public class Circle extends Geometry {
          private double r;
          Circle(double r){
              this.r = r;
          }
          @Override
          public double getArea() {
              return Math.PI*r*r;
          }
      }
      // Rectangle.java
      public class Rectangle extends Geometry {
          private double a,b;
      
          public Rectangle(double a, double b) {
              this.a = a;
              this.b = b;
          }
      
          @Override
          public double getArea() {
              return a*b;
          }
      }
      // Application.java
      public class Application {
          public static void main(String[] args) {
              Pillar pillar;
              Geometry bottom;
              bottom = new Rectangle(12,22);
              pillar = new Pillar(bottom,58);
              System.out.println("矩形底的体积为:"+pillar.getVolume());
              bottom = new Circle(10);
              pillar = new Pillar(bottom,58);
              System.out.println("圆形底的体积为:"+pillar.getVolume());
          }
      }
      
      
  • 开-闭原则

    • 设计对扩展开放,对修改关闭,实际上这句话的本质是指当一个设计中增加新的模块时不需要修改现有模块。
  • 多用组合少用继承原则

    • 继承与复用
      • 通过继承,子类与父类的关系是强耦合关系,即父类方法的行为更改时,必然导致子类发生变化
      • 通过继承的复用也称为“白盒复用”,其缺点是父类的内部细节对于子类而言是可见的
    • 组合与复用
      • 也即“Has-A”,一个对象是由几个对象组合而成
      • 组合对象来复用的方法称为“黑盒”复用
      • 对象与所包含的对象属于弱耦合关系
      • 可以在运行时,动态指定所包含的对象
  • 高内聚-低耦合原则

    • 如果类中的方法是一组相关的行为,则称该类是高内聚的,反之,则称是低内聚
    • 所谓低耦合就是不要让一个类包含太多其他的类的实例引用,以避免修改一部分会影响到另一部分
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值