文档章节

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());
    }

}

© 著作权归作者所有

共有 人打赏支持
旺仔没馒头
粉丝 2
博文 17
码字总数 12986
作品 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
给代码减负,会RIA的程序猿你伤不起!

身为一名求学者,不得不说,在漫长的等待中,我终于盼到了RIA的实训课程。 其实起先我并不知道什么是RIA,之所以参与进来是因为之前在中达金桥学过LINUX的同学告诉我,他们现在开办了个新的培...

ZDJQ
2011/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hadoop - 企业级大数据管理平台CDH(小技巧一)

附上: 喵了个咪的博客:w-blog.cn cloudera官网: https://www.cloudera.com/ 官方文档地址: https://www.cloudera.com/documentation/enterprise/latest.html 一 , 磁盘扩容磁盘迁移 对于磁盘...

喵了_个咪
25分钟前
1
0
手动安装android的sdk

手动安装android的sdk 用eclipse+sdk的方式开发app,使用android sdk manager无法下载新的sdk,可以手动下载安装。 查找sdk的地址 浏览器访问https://dl-ssl.google.com/android/repository/...

kyle960
25分钟前
1
0
call方法的模拟实现

call方法的模拟实现 初步思考 const person = { name:"小明" } function sayName() { console.log(this.name) } sayName.call(person) //result: 小明 上面的代码有两...

lsner
29分钟前
1
0
apache 报错 AH01089: search for temporary

程序上传文件一直失败。经过测试使用apache反向代理会失败,但是直接访问服务器则可以上传。 经过分析apache的错误日志发现如下提示: apache 报错 AH01089: search for temporary director...

硕硕和果果
35分钟前
2
0
java源码Integer.bitCount算法解析,分析原理

看了一道leetcode上面的题 461 ,Hamming Distance 计算两个整数有多少不同的位。其实很简单,取两个整数异或的值,然后计算出里面二进制有多少个1就行了。代码如下: public int hammi...

117
37分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部