java -- 模板设计、复合模式、单例设计

来源:互联网 发布:mac10.7.5版本软件 编辑:程序博客网 时间:2024/06/05 15:35

一、模板设计思想
模板设计思想重点在于思想;
程序有确定和不确定的方法,这时候就可以把不确定的方法抽象出来,然后开放对外访问的方法,子类重写父类不确定的方法,具体实现这个不确定的方法

设计一个程序时间计算器

abstract class GetTime{    public void getTime(){        //  记录开始的初始时间        long startTime = system.currentTimeMills();        //  程序        fun();        //  记录程序结束的时间        long endTime = system.currtTimeMills();    }    //  输出最后的程序执行的时间(结束时间 - 开始时间)0system.out.println("程序最后执行" + (endTime - startTime) + "毫秒")}class SubTime extends getTime(){    public void getTime(){        for(int i = 0; i < 20000; i++){            system.out.println(i);        }    }}

二、复合模式设计思想

设计要求

1.人类 吃
2.男人类 姓名 性别 有女朋友 吃肉 介绍女朋友是谁
3.女人类 姓名 性别 有男朋友 吃素 介绍男朋友是谁
4.男人挣钱给女朋友花(接口实现)

// 人类class Person{    private string name;    private string gender;    //  构造方法 set/get    public Person(){}    public Person(string name,string gender){        this.name = name;        this.gender = gender;    }    public void setName(string name){        this.name = name;    }    public string  getName(){        return name;    }    public void setGender(string gender){        this.gender = gender;    }    public void string getGender(){        return gender;    }    //抽象成员方法    public abstract void eat();}//男人类//男人类 姓名 性别  有女朋友 吃肉 介绍女朋友是谁class Man extends Person implements MakeManey{//创建一个女人类的成员变量    private Woman gf;    //Man 构造方法    public Man(){}    public Man(string name, string gender){        super(name,gender)    }    //  gf的set/get方法    public void setWoman(Woman gf){        this.gf = gf;    }    public Woman getWoman(){        return gf    }    public void eat(){        system.out.print("吃肉");    }    public void sayHi(){        system.out.println("我是:" + this.getName);        system.out.println("我的女朋友是:" + gf.getName);    }    //接口实现    public void makeManey(){        system.out.println("会挣钱")    }}//女人类//女人类 姓名 性别  有男朋友 吃素 介绍男朋友是谁class Woman extends Person{    private Man bf;    //构造方法    public Woman(){}    public Woman(string name, string gender){        super(name,gender)    }    //bf  set/get    public void setMan(Man bf){        this.bf = bf;    }    public Man getMan(){        return bf;    }    public void sayHi(){        system.out.println("我是:" + this.getName);        system.out.println("我的男朋友是:" + bf.getName);    }    //测试 通过男人类能不能调用女人类的方法    public void zhengRong(string body){        this.sayHi();        system.out.println("我要整容" + body)    }}//接口//男人挣钱给女朋友花(接口实现)interface MakeManey{    public abstract void makeManey();}//  测试类public static void main(string[] args){    Man m = new Man("凉凉","男");    Woman w = new Woman("如花","女");    m.getWoman(w);    m.sayHi();    w.getMan(m);    w.sayHi();    //通过男人类创建女人类的对象,并调用女人的方法    Woman gf = m.getWoman;    gf.zhengRong();    //通过女人创建男人的对象,并调用男人的方法    Man bf = w.getMan;    bf.makeManey();}

练习1:

新建类:汽车类(Car) 引擎类(Engine)
汽车类特征:汽车名称carName 汽车颜色carColor 汽车价格carPrice 引擎carEngine
汽车类行为:介绍sayHi:汽车名称 汽车颜色 汽车价格 引擎名称 引擎类型
引擎类特征:引擎名称engineName 引擎类型engineType

创建轮胎类Tire
将四个轮胎装载在汽车上 输出轮胎装到汽车上的哪个位置
左前轮 右前轮 左后轮 右后轮
轮胎类
成员变量 轮胎名称tireName 轮胎类型tireType 轮胎位置tirePosition

class Car{    private string carName;    private string carColor;    private string carPrice;    //添加引擎对象作为Car的成员变量    private Engine carEngine;    // 轮胎式汽车的成员变量,把轮胎放到数组中    private Tire[] tires = new Tire[4];    //  构造方法  set/get    public Car() {}    public Car(String name, String color, String carPrice, Engine carEngine) {    this.carEngine = carEngine;    this.carPrice =carPrice;    this.color = color;    this.name = name;}public String getName() {    return name;}public void setName(String name) {    this.name = name;}public String getColor() {    return color;}public void setColor(String color) {    this.color = color;}public String getCarPrice() {    return carPrice;}public void setCarPrice(String carPrice) {    this.carPrice = carPrice;}// 轮胎的set/getpublic void setTires(Tire[] tires) {    this.tires = tires;}public Tire[] getTires() {    return tires;}//需要一个方法 对汽车中的轮胎数组 一一的赋值//定义 int position 是数组的下标 也是轮胎的位置public void setTire(Tire[] tire, int position){    this.tires[position] = tire;switch (position) {    case 1:        tire.setTirePosition("左上");        break;    case 2:        tire.setTirePosition("左下");        break;    case 3:        tire.setTirePosition("右上");        break;    case 0:        tire.setTirePosition("右下");    break;    default:        break;    } }public void sayHi(){    System.out.println(name);     System.out.println(color);    System.out.println(carPrice);    // 介绍引擎    carEngine.sayHi();    //  循环介绍轮胎    for (int i = 0; i < tires.length; i++) {         Tire t = tires[i];         t.sayHi();    }}}//  引擎类//引擎类特征:引擎名称engineName 引擎类型engineTypeclass Engine{    string engineName;    stirng engineType;    //构造方法  set/get    public Engine() {}    public Engine(String engineName,String engineType) {        this.engineName = engineName;        this.engineType = engineType;    }    public String getEngineName() {        return engineName;    }    public void setEngineName(String engineName) {        this.engineName = engineName;    }    public String getEngineType() {        return engineType;    }    public void setEngineType(String engineType) {        this.engineType = engineType;    }public sayHi(){    system.out.println(engineName);    system.out.println(engineType);    }}//轮胎类/**创建轮胎类Tire *将四个轮胎装载在汽车上 输出轮胎装到汽车上的哪个位置*左前轮 右前轮 左后轮 右后轮*    轮胎类*    成员变量 轮胎名称tireName 轮胎类型tireType  轮胎位置tirePosition*/class Tire{    private string tireName;    private string tireType;    private string tirePosition;    public Tire() {}//  轮胎出厂的时候 没有轮胎装配的位置  所以不用初始化public Tire(String tireName,String tireType) {    this.tireName = tireName;    this.tireType = tireType;}public String getTireName() {    return tireName;}public void setTireName(String tireName) {    this.tireName = tireName;}public String getTireType() {    return tireType;}public void setTireType(String tireType) {    this.tireType = tireType;}public String getTirePosition() {    return tirePosition;}public void setTirePosition(String tirePosition) {    this.tirePosition = tirePosition;}public void sayHi() {    System.out.println(tireName);    System.out.println(tireType);    System.out.println(tirePosition);}}//测试类public static void main(String[] args) {    Engine engine = new Engine("v8","涡轮增压");    Car car = new Car("奥迪R8","红的","5万",engine);    for (int i = 0; i < 4; i++) {        Tire tire = new Tire("米其林","干胎");        car.setTire(tire, i);    }    car.sayHi();}}

单例设计模式 – (重点在于思想)
核心:在整个程序的执行期间,不管你创建这个类的对象多少个
整个程序有且只有一个 该类的对象 单实例对象

手机听歌(网易云 酷狗 虾米)
不管你是前台听歌 还是后台听歌 访问的都是同一个对象(同一个音乐播放器)

如何写一个单例出来?思路
不让外界来创建对象(把构造方法私有化)
自己来创建这个对象(写个创建对象自定义方法)
对外开放访问该对象权限(把对象的访问访问方法暴露出去)
(只对外提供获取方法)
(面试)

public static void main(String[] args) {    Single s = Single.getInstence();}}  //  单例类(饿汉式)class Single{//  创建单例对象private static Single single = new Single();// 私有化构造方法private Single() {}//  对外暴露访问的方法(get方法)public static Single getInstence() {    return single;}}

(单例)懒汉式 与 饿汉式写法不同

懒汉式特点:
延迟加载(懒加载)
只有你调用单例方法的事后 才会创建对象
而不是跟饿汉式一样 随着类的加载而加载

class SingleLan{//  声明一个单例对象private static SingleLan singleLan = null;//  私有化构造方法private SingleLan() {}//  对外开放访问的方法(当用户调用get方法事后 在创建对象)public static SingleLan getInctence() {    //  当单例对象为空时 会创建对象    //  一旦单例对象创建出来了就不为空    //  所以 这个单例对象 只会创建一次    if (singleLan == null) {        singleLan = new SingleLan();    }    return singleLan;}}
原创粉丝点击