1. 程式人生 > 其它 >poj-----Ultra-QuickSort(離散化+樹狀陣列)

poj-----Ultra-QuickSort(離散化+樹狀陣列)

要開發的小專案

傳統方案解決網站展示專案-問題分析

享元模式基本介紹

享元模式的原理類圖

內部狀態和外部狀態

享元模式應用例項

類圖:

以上是僅僅是享元模式的內部狀態

package com.flyweight;

public abstract class WebSite {
    public abstract void use();//抽象方法
}

 

package com.flyweight;

/**
 * 具體網站
 */
public class ConcreteWebSite extends WebSite {

    //共享的部分,內部狀態


    private String type = "";//網站釋出的形式

    //構造器
    public ConcreteWebSite(String type) {
        this.type = type;
    }

    @Override
    public void use() {

        System.out.println("網站的釋出形式為:"+type+" ,正在使用中。。。");
    }
}

 

package com.flyweight;

import java.util.HashMap;
import java.util.Map;

/**
 * 網站工廠類,根據需要返回一個網站


 */
public class WebSiteFactory {
    //建立一個集合,充當池的作用
    private Map<String ,ConcreteWebSite> pool = new HashMap<>();

    public WebSite getWebSiteCategory(String type){
        if(!pool.containsKey(type)){
            //如果池中沒有,就建立一個網站,並放入到池中
            pool.put(type,new ConcreteWebSite(type));
        }

        return (WebSite)pool.get(type);
    }

    //獲取網站分類的總數(池中有多少個網站型別)
    public int getWebSiteCount(){
        return pool.size();
    }
}

 

package com.flyweight;


public class Client {
    public static void main(String[] args) {

        //建立一個工廠類
        WebSiteFactory factory = new WebSiteFactory();

        //客戶要一個以新聞形式釋出的網站
        WebSite webSite1 = factory.getWebSiteCategory("新聞");
        webSite1.use();
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite2 = factory.getWebSiteCategory("部落格");
        webSite2.use();
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite3 = factory.getWebSiteCategory("部落格");
        webSite3.use();
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite4 = factory.getWebSiteCategory("部落格");
        webSite4.use();
        System.out.println("網站工廠中一共有"+factory.getWebSiteCount()+"個例項");
    }
}

 

執行結果:

網站的釋出形式為:新聞 ,正在使用中。。。

網站的釋出形式為:部落格 ,正在使用中。。。

網站的釋出形式為:部落格 ,正在使用中。。。

網站的釋出形式為:部落格 ,正在使用中。。。

網站工廠中一共有2個例項

接下來我們對上面的程式碼進行簡單地修改,新增上享元模式的外部狀態

 程式碼實現:

package com.flyweight;

public abstract class WebSite {
    public abstract void use(User user);//抽象方法
}

package com.flyweight;

/**
 * 具體網站
 */
public class ConcreteWebSite extends WebSite {

    //共享的部分,內部狀態
    private String type = "";//網站釋出的形式

    //構造器
    public ConcreteWebSite(String type) {
        this.type = type;
    }

    @Override
    public void use(User user) {
        System.out.println("網站的釋出形式為:"+type+" ,正在使用中。。。使用者是:"+user.getName());
    }
}

package com.flyweight;

import javax.swing.*;
import java.util.HashMap;
import java.util.Map;

/**
 * 網站工廠類,根據需要返回一個網站
 */
public class WebSiteFactory {
    //建立一個集合,充當池的作用
    private Map<String ,ConcreteWebSite> pool = new HashMap<>();

    public WebSite getWebSiteCategory(String type){
        if(!pool.containsKey(type)){
            //如果池中沒有,就建立一個網站,並放入到池中
            pool.put(type,new ConcreteWebSite(type));
        }
        return (WebSite)pool.get(type);
    }

    //獲取網站分類的總數(池中有多少個網站型別)
    public int getWebSiteCount(){
        return pool.size();
    }
}

package com.flyweight;

public class User {
    private String name;

    //新增一個帶引數的構造方法
    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

package com.flyweight;


public class Client {
    public static void main(String[] args) {

        //建立一個工廠類
        WebSiteFactory factory = new WebSiteFactory();

        //客戶要一個以新聞形式釋出的網站
        WebSite webSite1 = factory.getWebSiteCategory("新聞");
        webSite1.use(new User("Tom"));
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite2 = factory.getWebSiteCategory("部落格");
        webSite2.use(new User("jack"));
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite3 = factory.getWebSiteCategory("部落格");
        webSite3.use(new User("amy"));
        //客戶要一個以部落格形式釋出的網站
        WebSite webSite4 = factory.getWebSiteCategory("部落格");
        webSite4.use(new User("smith"));
        System.out.println("網站工廠中一共有"+factory.getWebSiteCount()+"個例項");
    }
}

執行結果:

網站的釋出形式為:新聞 ,正在使用中。。。使用者是:Tom

網站的釋出形式為:部落格 ,正在使用中。。。使用者是:jack

網站的釋出形式為:部落格 ,正在使用中。。。使用者是:amy

網站的釋出形式為:部落格 ,正在使用中。。。使用者是:smith

網站工廠中一共有2個例項