[EasyTao(道)系列文章之一]太极之道
綜述
周易是中國傳統文化的基石. 涵蓋了包括哲學在內的多個學科. 對于周易的理解, 可謂見仁見智. 在最近一個項目中需要使用農歷, 并進行簡單的五行關系比較. 我上網找了一下, 這方面的資料很多, 道理也不復雜, 但是真正可以使用的類庫卻完全沒有. 所以我打算把自己建立的類庫共享出來, 使其他人不需要做相同的重復勞動.
本人并非專門研究周易, 甚至還算不上易學愛好者. 只是在日常生活中偶有接觸, 感概于其精妙. 本系列文章與周易等哲學和無直接關系, 這里只是粗淺地使用計算機語言(Java)來對周易中一些概念進行建模, 以其能復用于不同項目中.
?
太極
周易之中, 萬象均始于太極(道生一,一生萬物). 故先定義接口太極(Taiji). 由于萬象均有其名稱及其它屬性, 為了便于計算機理解, 這里為萬物定義一個值(value)屬性,該屬性是萬物在特定領域的一個特征值. 另外再定義一個屬性(name)用于表示對象的標識, 使得人可以易于理解計算機所表達.
/*** <B>Taiji</B>* 太極.萬象均循此道.* */ public interface Taiji {public String getName();public int getValue();}/*** <B>AbstractTaiji</B>* 太極的抽象實現*/ public abstract class AbstractTaiji implements Taiji {protected int value;protected String name;protected AbstractTaiji(int value,String name) {this.value = value;this.name = name;}@Overridepublic String getName(){return name;}@Overridepublic int getValue(){return value;}@Overridepublic String toString() {return name;}@Overridepublic boolean equals(Object other) {if (other == null) {return false;}if (other instanceof AbstractTaiji) {return ((AbstractTaiji) other).value == value;}return false;}@Overridepublic int hashCode() {return ((Integer)value).hashCode();} }
易有太極,是生兩儀. 有了太極,接下來就要定義兩儀.兩儀也就是陰陽, <<素問>>曰:"?陰陽者,天地之道也,萬物之綱紀,變化之父母".?兩儀變化生四象. 四象由兩儀變化而來, 為了方便, 這里直接定義四象, 而不單獨定義兩儀.?
/*** <B>FourQuadrant</B>* 四象 */ public class FourQuadrant extends AbstractTaiji{/** 少陽 */public static final int SHAO_YANG = 0;/** 少陰*/public static final int SHAO_YIN = 1;/** 太陽 */public static final int TAI_YANG = 2;/** 太陰 */public static final int TAI_YIN = 3; private static final String[] QUADRANT_NAMES=new String[]{LiuyaoStringSymbol.FourQuadrant_SHAO_YANG,LiuyaoStringSymbol.FourQuadrant_SHAO_YIN,LiuyaoStringSymbol.FourQuadrant_TAI_YANG,LiuyaoStringSymbol.FourQuadrant_TAI_YIN};public static FourQuadrant getFourQuadrant(int value) {return create(value); }public static FourQuadrant[] getFourQuadrant() {FourQuadrant[] fourQuadrants=new FourQuadrant[4];for(int i=0;i<4;i++){fourQuadrants[i] =create(i);}return fourQuadrants;}private static FourQuadrant create(int value) {return new FourQuadrant(value, QUADRANT_NAMES[value%4]);}private FourQuadrant(int v, String name) {super(v, name);}@Overridepublic boolean equals(Object obj) {if (super.equals(obj) && (obj instanceof FourQuadrant)) {return true;}return false;}/** 老陽動化為少陽 */public FourQuadrant toTwoForms() {if (value == TAI_YANG) {return getFourQuadrant(SHAO_YANG);} else if (value == TAI_YIN){return getFourQuadrant(SHAO_YIN);} else if (value == SHAO_YANG || value == SHAO_YIN) {return this;} else {return null;}}/** 返回變爻:陽動返回少陰 */public FourQuadrant getChanged() {//FIXMEif(value ==TAI_YANG){return getFourQuadrant(SHAO_YIN);}if (value == TAI_YIN) {return getFourQuadrant(SHAO_YANG);}return new FourQuadrant(value, name);}/** 動: 陰變陰動;陽變陽動 */public void activate(){changeValue(value%2+2);}private void changeValue(int newValue) {this.value=newValue;this.name = QUADRANT_NAMES[newValue];}/** 陽轉為陰,陰轉為陽 */public FourQuadrant reverse() {if(isChanged()){throw new IllegalArgumentException();}return getFourQuadrant((value+1)%2);}/** 是否為老陽O 老陰X */public boolean isChanged() {return (value==TAI_YANG ||value==TAI_YIN);} }?
?
這里為什么不定義為枚舉(enum)類?
這主要考慮古人對概念的抽象性過高. 比如陰陽或后面要說的五行, 其字面意義看起來比較簡單, 但在現實中,不同領域的應用卻又有不同屬性. 比如五行在中醫里面所代表的事物和天文學甚至預測學中的意義是相差很大的. 我們知道Java的enum類不支持繼承,若將這些基本屬性定義為枚舉類, 會帶來一些重復工作. 所以為了簡便起見, 這里不使用枚舉類.
?
四象定義好了, 接下來要定義萬物了. 萬物都離不開道的原始屬性, 卻又有其自身特有的屬性. 萬物之間又有各種各樣的聯系,我們無法一一將其列舉.為了簡單地表示萬物之間的關系, 古人將世間事物分為五種(五行),即金木水火土. 并用五行之間的相生相克的關系來解釋事物之間的關系.?五行的定義和四象基本一樣, 代碼也幾乎完全重復, 但這里又不得不將其區分出來.?
/*** <B>FiveElements</B>* 五行*/ public class FiveElements extends AbstractTaiji {public static final int GOLD=0;public static final int WATER=1;public static final int WOOD=2;public static final int FIRE=3;public static final int SOIL=4;private static final String[] ELEMENTS_NAMES=new String[]{LiuyaoStringSymbol.FIVE_ELEMENT_GOLD,LiuyaoStringSymbol.FIVE_ELEMENT_WATER,LiuyaoStringSymbol.FIVE_ELEMENT_WOOD,LiuyaoStringSymbol.FIVE_ELEMENT_FIRE,LiuyaoStringSymbol.FIVE_ELEMENT_SOIL};public static FiveElements getElement(int value) {return create(value);}private static FiveElements create(int value) {return new FiveElements(value, ELEMENTS_NAMES[value%4]);}/** 相生 */public static final int Generate = 1<<1;/** 相克 */public static final int Restricte = 1<<2;private FiveElements(int v, String name) {super(v, name);}/** 生 */public boolean isGenerate(FiveElements other) {return (value + 1) % 5 == other.value;}/** 克 */public boolean isRestricte(FiveElements other) {return (value + 2) % 5 == other.value;} }五行還可以再細分. 比如黃歷中使用的五行和周易其它分支使用的五行有所不同, 這時可以按照自己的需要定義五行的具體類. 這里, 如果金木水火土各有其明確且不同的定義,也可以將其作為五行的子類來定義?.?如果具體的五行實現類之間又有復雜的關系, 不推薦將這些關系定義到具體的五行類里面(會使類變得臃腫且難以復用), 這里可以另外定義一個工具類來計算之間的關系.?如下圖
?五行子類定義示意圖
由于在線編輯很麻煩, 這一篇就到這里. 下一篇使用客戶端來編輯.?
下一篇 天干與地支
轉載于:https://www.cnblogs.com/easytao/archive/2012/07/14/easytao.html
總結
以上是生活随笔為你收集整理的[EasyTao(道)系列文章之一]太极之道的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server:向 SQL Ser
- 下一篇: 常用在线编辑器