文档章节

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特训第二课
旺仔没馒头
粉丝 2
博文 18
码字总数 13798
作品 0
济南
程序员
私信 提问
【Java学习路线】新手该如何一步步的学习 Java

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

Eddie_yang
11/15
0
0
Java研发大学毕业后为何找不到理想的工作

现在大学生在大学学习Java技术,毕业后直接工作,我想在大家心里这只是再平常不过的事情了,可是为啥刚一毕业的Java应聘工程师会遭到各个研发企业的拒绝,这是刚毕业的每个大学生心中的疑虑,...

我爱编程学习
06/07
0
0
成都大数据开发学习路线是什么?大数据开发学习难不难?

现在想学习大数据开发课程的朋友越来越多,当然其中有很多都是零基础,对编程语言也不是很了解。那么零基础能不能学习大数据开发呢?答案是肯定的。当然想要通过自学基本上是不可能的,不过可...

加米谷大数据
07/30
0
0
JAVA区块链项目实战视频课程

课程介绍 全国首套,基于java的区块链实战教程。目的是让更多的java编程者了解区块链,掌握区块链开发。 1、区块链理论:以node.js例子区块链原理有深刻理解; 2、区块链java实战:深刻理解区...

小红牛
09/14
0
0
五本值得一读的超棒Java电子书(附下载)

http://www.itwaka.com/ 网络上有很多关于Java的免费电子书,但是大多数都是过时的或者是不准确的。这是说的Java免费电子书是我收藏中最好的五本,它们在使用 Java编程语言的人群中是出名的,...

itwaka
2011/06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

soapui的安装使用

https://blog.csdn.net/weiqing723/article/details/78865734

暗中观察
21分钟前
0
0
ACID学习记录

ACID的C即一致性,打比方,多个线程并发执行转账业务:A转给B一块钱,无论成功与否(A+B)的总额是不会变的。事务执行前与执行后数据内在的逻辑始终是成立的。这里就是转账前与转账后两人存款的...

wmzsonic
36分钟前
0
0
手写tomcat+servlet

写程序一定要有思路,思路很重要! 一、我们分两步第一步先实现手写tomcat,第二部写servlet 所用技术: 1、soket通信 IO流 2、http请求与相应 3、解析xml 4、java反射技术 导入所需要的jar...

jason_kiss
58分钟前
1
0
Beetl模板的基础用法 【变量、循环、条件】---《Beetl视频课程》(2)

本期视频做了一个博客的首页列表; 内容简介:springboot 集成 beetlsql;使用for循环,使用if控制语句,使用虚拟属性,定义变量等等 一起学beetl目录:https://my.oschina.net/u/1590490?ta...

Gavin-King
今天
1
0
各种视频监控上墙方案的比较

方案1、一使用 DVR 、NVR 直接显示上墙 不得不说,这种办法是成本最低廉的,但这里有不少限制: 无法实现分散点的集中上墙。譬如连锁经营的酒店,如果我在总部建立一个集中上墙的环境,这个就...

PeakFang-BOK
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部