文档章节

java特训第三课

旺仔没馒头
 旺仔没馒头
发布于 2017/09/03 16:40
字数 1196
阅读 1
收藏 0

软件设计原则

目标:构建松散耦合的系统
1.开闭原则
  一个软件,应该对扩展开放,对修改关闭应。当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展。
2.里氏代换原则
  子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。
3.依赖倒置原则
  抽象不应当依赖于细节,细节应当依赖于抽象。也就是说应当依赖于接口,而不是依赖于实现。
4.接口隔离原则
  一个类对另外一个类的依赖是建立在最小的接口上,接口中尽量少包含方法。假如接口中方法过多,应将其拆散为多个接口。
5.合成/聚集复用原则
  使用合成/聚集来代替继承
6.迪米特法则
  不要和陌生人讲话,也就是不可以在一个类中暴露与它自己不相干的类。
7.单一职责原则
  就一个类而言,应该仅有一个引起它变化的原因,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.应该把多于的指责分离出去,分别再创建一些类来完成每一个职责。

常用设计模式

1.单例模式
  单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。在Java语言中,这样的行为能带来两大好处:
(1)对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。
(2)由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。

  public class Singleton {
  private Singleton(){
    System.out.println("Singleton is create");
  }
  private static Singleton instance = new Singleton();
  public static Singleton getInstance() {
    return instance;
  }
  }

2.代理模式
  为其他对象提供一种代理,并以控制对这个对象的访问。(Provide asurrogate or placeholder foranother object tocontrol access to it. )而对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。

public interface IDBQuery {
	String request();
}

public class DBQuery implements IDBQuery{
	public DBQuery(){
		try {
			Thread.sleep(1000); //可能包含数据库连接等耗时操作
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	@Override
	public String request() {
		return "request string";
	}
}


3.工厂模式
  工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。

public class Factory {  
    public BMW createBMW(int type) {  
        switch (type) {  

        case 320:  
            return new BMW320();  

        case 523:  
            return new BMW523();  

        default:  
            break;  
        }  
        return null;  
    }  
}

4.装饰者模式
  装饰者模式可以给已经存在的对象动态的添加能力


public abstract class Girl {
   String description = "no particular";
   public String getDescription(){
       return description;
   }
}


public abstract class GirlDecorator extends Girl {
   public abstract String getDescription();
}


public class Science extends GirlDecorator {
 private Girl girl;
 public Science(Girl girl){
     this.girl = girl;
 }
 @Override
 public String getDescription() {
     return this.girl.getDescription() + "+Like Science";
 }
 public void caltulateStuff() {
     System.out.println("scientific calculation!");
 }
}

public class Art extends GirlDecorator {
  private Girl girl;
  public Art(Girl girl){
      this.girl = girl;
  }
  @Override
  public String getDescription() {
      return this.girl.getDescription() + "+Like Art";
  }
  public void draw() {
      System.out.println("draw pictures!");
  }
}
public class Main {
  public static void main(String[] args) {
      //普通美国女孩
      Girl g1 = new AmericanGirl();
      System.out.println(g1.getDescription());

      //喜欢科学的
      Science g2 = new Science(g1);
      System.out.println(g2.getDescription());

      //喜欢科学和艺术的
      Art g3 = new Art(g2);
      System.out.println(g3.getDescription());
  }
}

5.模板方法
  模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术
  好莱坞原则(don't call us, we'll call you)

public abstract class  Account {
  /**
   * 模板方法,计算利息数额
   * @return    返回利息数额
   */
  public final double calculateInterest(){
      double interestRate = doCalculateInterestRate();
      String accountType = doCalculateAccountType();
      double amount = calculateAmount(accountType);
      return amount * interestRate;
  }

  /**
   * 基本方法留给子类实现
   */
  protected abstract String doCalculateAccountType();
  /**
   * 基本方法留给子类实现
   */
  protected abstract double doCalculateInterestRate();
  /**
   * 基本方法,已经实现
   */
  private double calculateAmount(String accountType){
      /**
       * 省略相关的业务逻辑
       */
      return 7243.00;
  }
}
public class MoneyMarketAccount extends Account {
    @Override
    protected String doCalculateAccountType() {

        return "Money Market";
    }
    @Override
    protected double doCalculateInterestRate() {
        return 0.045;
    }
}

public class CDAccount extends Account {
    @Override
    protected String doCalculateAccountType() {
        return "Certificate of Deposite";
    }
    @Override
    protected double doCalculateInterestRate() {
        return 0.06;
    }
}

public class Client {

    public static void main(String[] args) {
        Account account = new MoneyMarketAccount();
        System.out.println(“活期账号的利息数额为:" + account.calculateInterest());
        account = new CDAccount();
        System.out.println("定期账号的利息数额为:" + account.calculateInterest());
    }

}

© 著作权归作者所有

共有 人打赏支持
下一篇: java特训第二课
旺仔没馒头
粉丝 4
博文 20
码字总数 16560
作品 0
济南
程序员
私信 提问
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
131
0
珍藏收集,献出这份年薪50W的阿里Java高级开发内训手册

一、源码阅读 二、分布式架构总纲 分布式应用场景解决方案 三、微服务架构纲要

Java架构
2018/12/12
0
0
【粉丝福利】-JavaScript+jquery+html5特效实战,全方位逻辑思维特训!

【粉丝福利】-JavaScript+jquery+html5特效实战,全方位逻辑思维特训! 本次OSChina开源中国社区 联合 web前端学院,推出的 100特效特训,希望大家喜欢!! 获取免费听课权限时间:2017-...

小悦悦
2017/03/23
775
0
刚发布!Python一二线城市月薪15k起!12月再夺语言榜首

干掉Java,成为榜首 在最新公布的 PYPL 12 月编程语言指数榜中,Python 以 25.36% 的份额甩开Java(21.56 %),并逐渐与 Java 拉开差距。 实际上,这已经不是Python第一次超越Java了!早在5...

AI科技大本营
2018/12/23
0
0
刚发布!Python 一二线城市月薪 15K 起!12 月再夺语言榜首

干掉Java,成为榜首 在最新公布的PYPL 12月编程语言指数榜中,Python以 25.36%的份额甩开Java(21.56 %),并逐渐与Java拉开差距。 实际上,这已经不是Python第一次超越Java了!早在5 月,P...

CSDN资讯
2018/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
50分钟前
2
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
50分钟前
2
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
2
0
IntelliJ IDEA 第一个 Scala 程序

IntelliJ 安装完成 Scala 插件后,你需要尝试使用 IntelliJ 来创建并且运行第一个程序。 通常这个程序只是简单的输出 Hello World。 创建一个新工程 在文件下面选择新建,然后选择创建工程。...

honeymose
今天
2
0
csapp 习题 - 如何实现异或 exclusive-or

阅读 csapp v3 时,练习题 2.13 很有意思。练习题描述如下。 位设置是对于参数 mask 中每一个为 1 的位,那么参数 x 中相应位则被设置为 1 ;位清除是对于参数 mask 中每一个为 1 的位,那么...

ylme
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部